줄을 칸으로 나누고, 정렬하고, 중복을 지우고, 문자를 바꾸고, 차이를 보는 명령이다. 로그와 CSV를 파이프로 다룰 때 grep 다음에 자주 온다.

cut

cut은 구분자로 나눈 칸, 또는 글자 위치를 잘라 낸다.

Bash
cut -d: -f1 /etc/passwd
cut -d, -f1,3 data.csv
cut -c1-10 file.txt

`-d`는 구분자다. 기본 구분자는 탭이다. `-f`는 칸 번호이고 1부터 센다. `1,3`은 1번과 3번, `2-4`는 2번부터 4번까지다. 구분자가 없는 줄은 기본적으로 그대로 나온다. 그런 줄을 빼려면 `-s`를 붙인다.

`-c`의 범위는 문자가 아니라 바이트다. 한글 한 글의 중간이 잘릴 수 있다. 칸을 나눌 수 있으면 `-d`와 `-f`를 쓴다.

sort

Bash
sort file.txt
sort -n numbers.txt
sort -h sizes.txt
sort -r file.txt
sort -u file.txt
sort -t, -k2,2n data.csv

`-n`은 숫자로 비교한다. 문자열 정렬에서는 `10`이 `2`보다 앞이다. `-h`는 `1K`, `2M`처럼 단위가 붙은 크기를 비교한다. `-r`은 순서를 뒤집는다. `-u`는 같은 줄을 한 번만 남긴다.

`-t`는 칸 구분자, `-k`는 그 칸이다. `-k2,2`는 2번 칸만 비교한다. 끝을 적지 않으면 그 칸부터 줄 끝까지 비교한다. `n`을 칸 지정 뒤에 붙이면 그 칸만 숫자로 본다.

월 이름처럼 사람이 읽는 달을 정렬할 때는 `-M`이 있다. 영문 약자 Jan, Feb에 맞다.

uniq

uniq는 바로 이웃한 같은 줄만 줄인다. 파일 전체에 흩어진 중복을 없애려면 먼저 sort 한다.

Bash
sort file.txt | uniq
sort file.txt | uniq -c
sort file.txt | uniq -d
sort file.txt | uniq -u

`-c`는 횟수를 앞에 붙인다. `-d`는 두 번 이상 나온 줄만, `-u`는 한 번만 나온 줄만 남긴다. 같은 줄을 지우는 것만이 목표면 `sort -u`로 충분하다.

tr

tr은 문자를 바꾸거나 지운다. 파일 이름을 받지 않고 표준입력만 읽는다. 동작 단위는 바이트라서, 한글을 범위로 변환하는 용도에는 맞지 않다.

Bash
tr 'a-z' 'A-Z' < file.txt
tr -d '\r' < win.txt > unix.txt
tr -s ' ' < file.txt

`-d`는 그 문자를 지운다. `-s`는 연속된 같은 문자를 하나로 줄인다. 윈도우 줄 끝의 캐리지 리턴을 지울 때 `tr -d '\r'`을 쓴다.

tee와 diff

tee는 표준입력을 화면과 파일에 동시에 쓴다. `-a`는 파일을 비우지 않고 뒤에 붙인다.

Bash
ls -al | tee listing.txt
make 2>&1 | tee -a build.log

diff는 두 파일의 차이를 보여 준다. `-u`는 통합 형식이다. 무엇이 빠지고 더해졌는지 위아래로 보여 준다. `-r`은 디렉터리를 재귀로 비교한다.

Bash
diff -u old.txt new.txt
diff -rq dir1 dir2

`-q`는 내용 대신 파일이 다른지만 알려 준다.