본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스 / 유닉스 / 셸 프로그래밍] 문자열 자르기, 열 추출하는 명령어 cut 사용법, 예제

[리눅스 / 유닉스 / 셸 프로그래밍 목차 링크 정리 ]

안녕하세요~~!

주인장입니다. ㅎㅎ 오늘은 간단한 명령어 cut에 대해서 포스팅 해볼게요

cut명령어는 워낙 어렵지 않아서 주말에 짧게 작성하는 간단 포스팅이 되지 않을까 생각합니다.

 

CUT 명령어란?

사진 출처: https://www.cutcardstock.com/products/custom-card-stock-and-paper-cutting

cut은 문자열을 자를 때 주로 사용해요.

awk랑 sed도 문자열 자르는 기능이 있지만, cut은 그 의미가 좀 더 명확하고 간결하죠 ㅎㅎ

첫 번째 글자부터 ~~ 10번째 글자까지 잘라서 사용한다던가..

3번째 글자부터 5번째 글자까지 사용한다던가..

이렇게 글자단위로 자를 수도 있고요. 이건 문자열이 고정길이 단어로 연달아 되어 있을 때 유용하겠죠.

한 예로 날짜 '20190930'이런형식은 앞에 4자리는 무조건 년도니까 이런거요

 

또는 구분자를 정해서 그 걸 기준으로 잘라낼 수도 있어요

passwd는 각 필드를 ':'로 구분하는데, ':'를 기준으로 항목들을 자를 수도 있고,

TAB형식으로 들어가 있는 문자열 라인을 파싱할 수도 있고..

 

네트워크 단에서 데이터가 들어오면 바이터 단위로 파싱할 수도 있습니다.

 

근데 이게 한 줄만 해주는게 아니라 2차원 배열처럼 또는 행렬처럼, 구성되어 있어도 한 라인라인에 다 적용시키는 거기 때문에 열 특정 정보들을 추출해서 배열에다가 저장해 쓰기에도 좋아요 ㅎㅎ

간단명료하죠??

명령어 문법과 대표 옵션

cut

$cut option file

데이터의 열을 추출할 때 사용합니다. 이 때 추출하는 데이터는 파일 각 줄의 글자, 바이트 또는 필드가 된다.

옵션 OPTIONS

옵션

의미

-b (--byte)

바이트를 기준으로 추출합니다.

-c (--character)

문자수를 기준으로 추출합니다.

-f (--fields)

파일의 필드를 기준으로 추출합니다.

-d (--delimiter)

필드 구분자를 지정합니다. (기본 필드 구분은 [TAB] )

옵션은 b나 c 또는 f 둘 중 하나를 사용해주면 됩니다.

사용예제, 사용법

':'를 기준으로 파일 정보 뽑기

첫 번째는 모두가 가지고 있는 사용자 계정 파일 /etc/passwd 파일을 기준으로 실습을 진행해볼게요 

현재 제가 가지고 있는 /etc/passwd파일은 내용은 이와 같습니다.

보니까 ':'를 기준으로 맨 첫번째 열에 사용자계정명이 들어가 있네요.

사용자 계정을 뽑으려면,,, 구분자를 ':'로 지정해줘야겠죠??

$ cut -f 1 -d ':' /etc/passwd

만약에 몇 개를 골라서 뽑고 싶다~ 그러면 컴마(,)와 대시(-)를 기준으로 추출해주면 됩니다.

컴마는 띄엄띄엄 골라서 뽑을때, 대시는 연속된 컬럼을 뽑을 때!

3번째, 4번째 열에 위치하는 UID와 GID를 뽑아볼게요.

근데 결과값이 너무 많으니까 head를 이용해서 앞 10개만 추출해봅시다.

~$ cut -f 3-4 -d ':' /etc/passwd | head

잘 추출된 것을 볼 수 있어요! ㅎㅎ

탭 기준으로 뽑기

사실 딜리미터의 디폴트 값이 TAB이라고 했었어요 ㅎㅎ

그럽 TAB기준으로 뽑아볼까요? tab으로 구분한 파일을 하나 만들어줬어요 ㅎㅎ

mon, tues, wed, thurs, fri 요일을 각각 tab으로 구부한 다음에 cuttest.txt에다가 작성해줬습니다.

# echo "mon    tues     wed     thurs    fri" >> cuttest.txt
# cat cuttest.txt
# cut -f2 cuttest.txt

참고로 -f2 이렇게 붙여도 되고 띄어도 돼요

tab은 [Ctrl]+[v]한 후 tab을 눌러주면 넣을 수 있습니다.

잘 추출된 것을 확인할 수 있어요

근데 가독성을 위해 딜리미터로 tab을 명시해주고 싶다!

# cut -f2 -d$'\t' cuttest.txt

요렇게 하면 됩니다. ㅎㅎ

공백, 띄어쓰기 기준으로 뽑기

일단 date명령어 결과 값이 띄어쓰기로 구분되어 있으니까 예를 예시로 들어볼게요 

이 값은 파일이 아니고, 명령어 결과 값이죠??

명령어 결과를 입력값으로 전달해주기 위해 파이프(|)를 사용합시다.

여기서 4번째 열에 해당하는 시간을 추출해볼게요

시간정보가 잘 뽑혔네요 ㅎㅎ

캐릭터, 문자열 단위로 뽑기

이번에는 -f옵션이 아닌 -c옵션을 사용해볼게요 ㅎㅎ

날짜가 무조건 20190810 이렇게 년월일로 생성되는 파일이 있다고 가정해봅시다.

예를 들면 파일이 날짜별로 sample.20190910.log 이렇게 생성되는거죠!

근데 만약에 어떤 시스템은 test.09102019.log 이렇게 날짜를 월시년 형태로 남긴다고 가정해봅시다.

앞에서는 파일, 또는 명령어의 결과 값을 가지고 파싱하는걸 해봤으니.

이번에는 셸 프로그래밍을 응용해서 해볼게요

 

첫글자부터 4글자는 년도를 의미하겠죠

year=$(echo $1 | cut -c1-4)

뒤에 4글자는 월일을 합쳐서 표현했을거예요 똑같은 방식으로 추출할 수 있겠죠?

year=$(echo $1 | cut -c1-4)
monthday=$(echo $1 | cut -c5-8)
DATE_FORMAT1=${year}${monthday}
DATE_FORMAT2=${monthday}${year}
find . -type f \( -name "*${DATE_FORMAT1}*" -o -name "*${DATE_FORMAT2}*" \) -exec gzip {} \;

간단하게는 이렇게 작성해줄 수 있어요 ㅎㅎㅎ압축은 gzip을 사용했고 파일들을 추출하기 위해 find를 사용해봤어요 ㅎㅎ 실행 결과를 함 볼까요

오 20190910날짜가 들어간 파일만 잘 추출했네요!

 

TIP, 첫 문자 또는 마지막 문자만 자르기

첫 문자만 자르기

cut_first=$(echo $word | cut -c 2-)

이렇게 하면 두번째 문자부터 끝까지 자르기~ 라는 의미입니다.

마지막 문자만 자르기

그러면 마지막 문자만 자르려면??

echo $word | rev | cut -c 2- | rev

reverse라는 명령어를 이용해서 이렇게 응용할 수 있다는거~

 

오늘은 간단하게 cut 명령어를 사용해보았어요 ㅎㅎ

주말이 얼마 남지 않았군요 ㅠㅠ 빨리 가서 남은 일요일을 즐겨야겠어요 ㅎㅎ여러분들도 주말 잘 마무리하세요~ ㅎㅎ 공감, 댓글, 광고보답은 정보공유를 위해 포스팅을 작성하는 저에게 힘이 된답니당 :)

그럼 다음 포스팅에서 봐요!

  • 이성일 2020.07.16 16:12

    안녕하세요 작성자님,
    윈도우 10에서 우분투를 설치하여, 리눅스 시스템을 공부하고 있습니다.
    CUT을 테스트 하고 싶은데... 누구나 있다고 하신 passwd 파일이 어디에 있는지 ... 모르겠습니다 ㅠ

    • IT 양햄찌(jhnyang) 2020.07.16 16:20 신고

      안녕하세요. root계정으로 로그인 후 etc 디렉터리에 있습니다 (cd /etc)
      passwd는 사용자관리에 필요한 기본적 시스템 파일이며, 해당 파일에 대해 알고싶으시면 제 리눅스유닉스 목차에서 '사용자관리'포스팅을 참고하시면 됩니다 :)

  • 이성일 2020.07.17 09:50

    감사합니다 작성자님, 잘 찾아서 학습하였습니다.

    궁금한 부분이 있는데, cut -f 1 -d ':' /home/laon/test 이 부분에서, 앞의 -f 는 어떤 의미를 가지고 있는건가요??

    • IT 양햄찌(jhnyang) 2020.07.17 10:00 신고

      열을 의미합니다. -d는 delimeter를 가리키는 옵션으로 ':'를 기준으로 cut한뒤 첫 번째 필드(열) 부분을 뽑겠다는 필드지정 옵션입니다. -f 3하면 3열을 뽑겠다는 거겠죠?