Linux cut 명령어: 텍스트 추출

LinuxBeginner
지금 연습하기

소개

이번 실습에서는 Linux의 cut 명령어를 사용하여 텍스트 파일에서 데이터를 추출하고 분석하는 방법을 배웁니다. 지역 서점에서 근무하며 고객 및 도서 정보를 처리해야 하는 상황을 가정해 보겠습니다. cut 명령어를 사용하면 데이터 파일에서 특정 열이나 필드를 효율적으로 추출하여 데이터 관리 및 분석을 수행할 수 있습니다.

사전 준비 사항

실습을 시작하기 전에 다음 사항을 확인하세요:

  • Linux 명령줄에 대한 기본적인 이해
  • Linux 터미널 사용 가능 여부 (이 실습은 /home/labex/project 디렉토리에서 터미널을 사용하는 것을 가정합니다)

서점 데이터 이해하기

먼저 서점 데이터 파일을 살펴보겠습니다. customers.txtbooks.txt라는 두 개의 파일이 있습니다.

먼저 customers.txt 파일의 내용을 확인해 봅시다:

cat /home/labex/project/customers.txt

다음과 유사한 출력이 나타나야 합니다:

ID,Name,Age,Email
1,John Doe,25,john.doe@email.com
2,Jane Smith,35,jane.smith@email.com
3,Lily Chen,30,lily.chen@email.com
4,Andy Brown,22,andy.brown@email.com

이제 books.txt 파일을 살펴보겠습니다:

cat /home/labex/project/books.txt

출력 결과는 다음과 같아야 합니다:

ISBN,Title,Author,Price
978-1234567890,The Great Adventure,Alice Writer,19.99
978-2345678901,Mystery in the Woods,Bob Author,24.99
978-3456789012,Cooking Basics,Carol Chef,15.99
978-4567890123,Science Explained,David Scientist,29.99

이 파일들은 고객과 도서에 대한 서로 다른 필드를 포함하는 쉼표로 구분된 값(CSV) 형식입니다.

예상한 출력이 보이지 않거나 오류가 발생하면 다음을 확인하세요:

  • 올바른 디렉토리(/home/labex/project)에 있는지 확인
  • ls -l 명령어를 실행하여 파일이 존재하는지 확인
  • 파일이 없는 경우, 수동으로 생성하거나 실습 관리자에게 문의

고객 이름 추출하기

데이터를 확인했으니, 이제 cut 명령어를 사용하여 특정 정보를 추출해 보겠습니다. 먼저 customers.txt 파일에서 고객 이름을 추출합니다.

cut 명령어는 -d 옵션을 사용하여 구분 기호(여기서는 쉼표)를 지정하고, -f 옵션을 사용하여 표시할 필드를 선택합니다.

다음 명령어를 실행하세요:

cut -d ',' -f 2 /home/labex/project/customers.txt

명령어의 구성 요소는 다음과 같습니다:

  • cut: 사용하는 명령어 이름
  • -d ',': 필드 구분 기호로 쉼표를 사용함을 지정
  • -f 2: 두 번째 필드를 추출하도록 cut에 지시
  • /home/labex/project/customers.txt: 입력 파일 경로

다음과 같은 출력이 나타납니다:

Name
John Doe
Jane Smith
Lily Chen
Andy Brown

헤더인 "Name"도 포함되어 있음을 알 수 있습니다. 이는 cut이 헤더 라인을 파일의 다른 라인과 동일하게 처리하기 때문입니다.

헤더를 제외하려면 tail 명령어를 cut과 함께 사용할 수 있습니다:

cut -d ',' -f 2 /home/labex/project/customers.txt | tail -n +2

이 파이프라인은 두 가지 작업을 수행합니다:

  1. cut이 각 라인에서 두 번째 필드(이름)를 추출합니다.
  2. tail -n +2가 두 번째 라인부터 출력하여 헤더를 효과적으로 건너뜁니다.

이제 출력 결과는 다음과 같습니다:

John Doe
Jane Smith
Lily Chen
Andy Brown

예상한 출력이 보이지 않는다면:

  • 명령어를 정확하게 입력했는지 다시 확인하세요.
  • customers.txt 파일이 수정되지 않았는지 확인하세요.
  • cat /home/labex/project/customers.txt를 다시 실행하여 파일 내용을 확인하세요.

여러 필드 추출하기

데이터에서 여러 필드를 추출해야 하는 경우가 많습니다. customers.txt 파일에서 고객 이름과 나이를 모두 추출해 보겠습니다.

다음 명령어를 사용하세요:

cut -d ',' -f 2,3 /home/labex/project/customers.txt

이 명령어는 이전과 비슷하지만, -f 옵션에서 두 개의 필드를 지정합니다:

  • -f 2,3: 두 번째와 세 번째 필드(이름과 나이)를 추출합니다.

출력 결과는 다음과 같아야 합니다:

Name,Age
John Doe,25
Jane Smith,35
Lily Chen,30
Andy Brown,22

보시다시피 -f 옵션에서 쉼표로 구분하여 여러 필드를 지정할 수 있습니다. 출력 결과는 추출된 필드 사이에 원래의 구분 기호(쉼표)를 유지합니다.

출력 결과가 일치하지 않는다면:

  • -f 옵션에서 2와 3 사이에 쉼표를 포함했는지 확인하세요.
  • customers.txt 파일이 변경되지 않았는지 확인하세요.
  • -d ',' 옵션 없이 명령어를 실행하여 파일이 다른 구분 기호를 사용하는지 확인해 보세요.

필드 범위 추출하기

cut 명령어를 사용하면 필드 범위를 추출할 수도 있습니다. customers.txt 파일에서 고객 ID부터 나이까지(1~3번 필드) 모든 필드를 추출해 보겠습니다.

다음 명령어를 사용하세요:

cut -d ',' -f 1-3 /home/labex/project/customers.txt

이 명령어의 새로운 점은 다음과 같습니다:

  • -f 1-3: 1부터 3까지의 필드 범위를 포함하여 지정합니다.

출력 결과는 다음과 같아야 합니다:

ID,Name,Age
1,John Doe,25
2,Jane Smith,35
3,Lily Chen,30
4,Andy Brown,22

이 명령어는 1부터 3까지의 필드 범위를 추출합니다. 또한 -f 1-3,5와 같이 범위와 개별 필드를 결합하여 1, 2, 3, 5번 필드를 추출할 수도 있습니다.

예상한 출력이 보이지 않는다면:

  • -f 옵션에서 1과 3 사이에 하이픈(-)을 사용했는지 확인하세요.
  • customers.txt 파일이 수정되지 않았는지 확인하세요.
  • 각 필드를 개별적으로 추출해 보며(예: -f 1, -f 2, -f 3) 파일에 모든 필드가 존재하는지 확인하세요.

고정 폭 필드 작업하기

데이터가 구분 기호로 분리되지 않고 고정 폭 열로 정렬되어 있는 경우도 있습니다. cut 명령어는 -c 옵션을 사용하여 문자 위치를 지정함으로써 이 경우도 처리할 수 있습니다.

고정 폭 데이터가 포함된 새 파일을 만들어 보겠습니다:

cat << EOF > /home/labex/project/inventory.txt
ISBN     Title          Quantity
1234567890The Great Adv      100
2345678901Mystery in th       75
3456789012Cooking Basi       50
4567890123Science Exp        125
EOF

이 명령어는 here-document(<<EOF)를 사용하여 고정 폭 데이터가 포함된 inventory.txt라는 새 파일을 생성합니다.

이제 문자 위치를 사용하여 도서 제목만 추출해 보겠습니다:

cut -c 11-25 /home/labex/project/inventory.txt

새로운 점은 다음과 같습니다:

  • -c 11-25: 각 라인에서 11번째부터 25번째 문자까지 추출하도록 cut에 지시합니다.

결과는 다음과 같습니다:

itle          Q
The Great Adv
Mystery in th
Cooking Basi
Science Exp

이 명령어는 각 라인에서 11번째부터 25번째 문자를 추출하며, 이는 고정 폭 데이터의 제목 필드에 해당합니다.

예상한 출력이 나오지 않는다면:

  • inventory.txt 파일이 올바르게 생성되었는지 확인하세요(cat /home/labex/project/inventory.txt로 확인 가능).
  • 올바른 문자 범위(11-25)를 사용했는지 확인하세요.
  • 제목이 정렬되지 않은 것처럼 보이면 문자 범위를 조정해 보세요.

cut과 다른 명령어 결합하기

cut 명령어는 다른 Linux 명령어와 결합할 때 더욱 강력해집니다. cutgrep과 함께 사용하여 가격이 20달러 이상인 모든 도서를 찾아 제목을 표시해 보겠습니다.

다음 명령어를 실행하세요:

grep -E ',[2-9][0-9]\.[0-9]{2}$' /home/labex/project/books.txt | cut -d ',' -f 2

이 명령어 파이프라인은 두 가지 작업을 수행합니다:

  1. grep -E ',[2-9][0-9]\.[0-9]{2}$': 정규 표현식을 사용하여 가격이 20달러 이상인 라인을 찾습니다.
    • ,[2-9][0-9]\.[0-9]{2}$: 쉼표 뒤에 20에서 99 사이의 숫자, 소수점, 그리고 라인 끝에 두 자리 숫자가 오는 패턴을 찾습니다.
  2. cut -d ',' -f 2: grep이 찾은 라인에서 도서 제목(두 번째 필드)만 추출합니다.

다음과 유사한 출력이 나타나야 합니다:

Mystery in the Woods
Science Explained

예상한 출력이 보이지 않는다면:

  • books.txt 파일에 올바른 데이터가 포함되어 있는지 확인하세요.
  • grep 정규 표현식을 올바르게 입력했는지 확인하세요.
  • grep 명령어만 단독으로 실행하여 어떤 라인이 선택되는지 확인해 보세요.
  • cut 명령어가 두 번째 필드를 올바르게 지정하고 있는지 확인하세요.

요약

이번 실습에서는 Linux의 cut 명령어를 사용하여 텍스트 파일에서 특정 데이터를 추출하는 방법을 배웠습니다. 다음 내용을 연습했습니다:

  • CSV 파일에서 단일 필드 추출
  • 여러 필드 및 필드 범위 추출
  • 고정 폭 데이터 작업
  • cutgrep 같은 다른 명령어 결합

이러한 기술은 서점 재고 관리부터 모든 종류의 구조화된 텍스트 데이터 처리까지, 다양한 시나리오에서 데이터 처리 및 분석을 위해 매우 유용합니다.

이번 실습에서 다루지 않은 추가적인 cut 명령어 매개변수:

  • -s: 구분 기호가 포함되지 않은 라인 억제
  • --output-delimiter=STRING: STRING을 출력 구분 기호로 사용
  • --complement: 선택된 바이트, 문자 또는 필드 집합을 보완(반전)

학습을 더 발전시키려면 이러한 추가 매개변수를 실험해 보고 직접 데이터 파일을 만들어 연습해 보세요. 더 자세한 정보가 필요하면 man cut 명령어를 통해 cut 명령어에 대한 포괄적인 매뉴얼을 확인할 수 있습니다.