이번에는 파일 입출력과 관련된 명령어 cut, paste, sort, diff, sed를 각각 예제를 통해 알아보겠다.
cut 명령어
텍스트 파일에서 특정 부분을 잘라내어 출력할 때 사용된다.
구분자(delimiter)를 기준으로 데이터를 분리하여 원하는 열(column)을 추출하는 데 유용하다.
cut [옵션] [파일 이름]
예제에서 사용될 data 파일의 내용은 다음과 같다.
아래는 cut 명령어에서 사용할 수 있는 옵션들이다.
-c, --characters 옵션
문자 단위로 잘라낸다.
특정 위치의 문자를 기준으로 잘라낼 수 있다.
위는 data 파일에서 2번째 문자부터 5번째 문자까지만 출력하는 명령이다.
-d, --delimiter 옵션
필드 구분자를 지정한다.
기본적으로 cut은 탭(\t)을 구분자로 사용하지만, -d 옵션을 사용하여 다른 구분자를 설정할 수 있다.
그리고 -f 옵션(--fields 옵션)을 사용해 출력할 필드를 지정할 수 있다.
위는 data 파일에서 " "를 구분자로 사용해 각각의 필드로 나누고 1번째 필드와 4번째 필드만 출력하는 명령이다.
파이프라인을 사용해 다음과 같이 활용할 수도 있다.
위의 결과를 아래에서 4개 행만 출력할 수 있다.
paste 명령어
파일을 수평으로 결합하여 출력하는 데 사용된다.
즉, 여러 파일의 각 줄을 가로로 붙여서 출력할 때 사용하는 명령어다.
기본적으로 paste는 파일들의 각 줄을 구분자 없이 결합하지만, 구분자를 지정할 수도 있다.
paste [옵션] [파일1] [파일2] ...
예제에서 사용될 file1과 file2의 내용은 다음과 같다.
paste 명령어를 활용해 file1과 file2의 내용을 수평으로 붙여보면 다음과 같다.
파일을 지정하지 않으면 paste는 표준 입력을 읽어와서 결합한다.
예를 들어, paste 명령어를 여러 번 실행하여 여러 줄을 입력하고 결합할 수 있다.
-d, --delimiters 옵션
d옵션을 사용하면 구분자를 지정할 수 있다.
기본적으로 탭(\t)이 구분자로 사용되지만, d옵션을 사용하여 다른 구분자로 변경할 수 있다.
위는 paste 명령어로 file1과 file2를 수평으로 결합하는데, :를 이용해 구분자를 두는 명령이다.
-s, --serial 옵션
각 파일의 내용을 세로로 결합하는 대신 각 파일의 모든 줄을 순차적으로 하나의 줄로 합친 후 출력한다.
즉, 수평이 아닌 수직으로 결합하는 옵션이다.
위처럼 file1과 file2의 내용이 각각 한 줄로 나타나고, 수직으로 결합된다.
d 옵션과 함께 사용하면 구분자를 이용해 구분하여 출력할 수 있다.
이를 통해 각 파일의 내용을 하나의 줄로 결합할 수 있다.
diff 명령어
두 파일이나 디렉토리 간의 차이점을 비교하고, 다른 부분을 출력하는 데 사용된다.
주로 텍스트 파일의 차이를 확인하거나, 코드 변경 사항을 추적할 수 있다.
diff [옵션] [파일1] [파일2]
-u, --unified 옵션
u옵션은 통합 형식으로 차이점을 출력해서 변경된 부분을 보다 직관적으로 볼 수 있게 해준다.
주로 패치 파일을 생성할 때 많이 사용된다.
-c, --context 옵션
문맥 형식으로 차이점을 출력한다.
-u와 비슷하지만, 변경된 줄을 포함하여 더 많은 컨텍스트 정보를 제공한다.
diff 명령어 사용 예시
$ cat file1.txt
apple
banana
cherry
$ cat file2.txt
apple
banana
orange
$ diff file1.txt file2.txt
3c3
< cherry
---
> orange
여기서 출력된 3c3는 file1.txt와 file2.txt의 세 번째 줄에 차이가 있다는 것을 의미한다.
sort 명령어
파일의 내용을 정렬하는 데 사용된다.
기본적으로 sort는 각 줄을 오름차순으로 정렬한다.
sort [옵션] [파일 이름]
sort 예제에서 사용될 data 파일의 내용은 다음과 같다.
sort를 사용하면 위의 파일의 내용을 알파벳 순으로 정렬해준다.
-r, --reverse 옵션
내림차순으로 정렬할 때 사용한다.
-k, --key 옵션
특정 키를 기준으로 정렬한다.
-k 옵션을 사용하면 특정 열(컬럼)을 기준으로 정렬할 수 있다.
아래는 -k 옵션을 이용해 3번째 컬럼을 기준으로 정렬한 것이다.
-t, --field-separator 옵션
구분자를 사용해 파일 내 필드를 구분할 수 있다.
아래는 /etc/passwd 파일의 아래에서 5개의 줄을 출력한 것이다.
sort 명령어의 -t 옵션을 활용하여 /etc/passwd 파일에서 ":"로 필드를 구분하고 세 번째 필드(UID)를 기준으로 정렬하면 다음과 같다.
-n, --numeric-sort 옵션
위 스크린 샷에서 맨 마지막에 정렬된 수는 99고, 그 전 수는 999인 것을 미루어 보아
위의 정렬은 실제 수가 아닌 숫자를 문자로 인식해 정렬한 것임을 알 수 있다.
이때 -n 옵션을 이용하면 실제 수로 인식해 정렬할 수 있다.
sed 명령어
sed는 Stream Editior의 약자로서 파일을 처리하고 수정하는데 사용되는 강력한 스트림 편집기다.
주로 텍스트의 패턴을 찾아서 변경하거나 삭제하는 작업에 사용된다.
sed [옵션] '명령' [파일 이름]
치환
(1)
sed 's/A/B/g' [파일 이름]
(2)
sed 's/A/B' [파일 이름]
(3)
sed '숫자s/A/B/' [파일 이름]
(4)
sed -n 's/A/B/gp' [파일 이름]
(1)
파일 내 단어 A를 B로 모두 치환한다.
(2)
여기서 g를 빼면 각 줄에서 첫 번째로 나오는 A만 B로 치환한다.
(3)
s 앞에 숫자 x를 넣으면 x번째 줄의 A를 B로 치환한다.
즉 행 번호를 지정해 수정하는 것이다.
(4)
-n 옵션을 주고 끝에 p를 넣으면 치환하는 단어가 있는 줄만 출력한다.
위의 data 파일을 이용해 실습을 해보자.
019를 999로 바꿔보자.
019가 999로 바뀌어 출력된 것을 볼 수 있다.
파일 자체는 수정되지 않은 것 또한 알 수 있다.
이때 -i 옵션을 넣으면 파일 자체를 수정할 수 있다.
위를 통해 -i 옵션을 넣으면 파일 자체의 내용이 바뀌는 것을 알 수 있다.
아래처럼 -n 옵션과 p를 붙이면 내용이 바뀌는 줄만 출력할 수 있다.
아래는 data 파일에서 5번째 줄 이후부터 나오는 모든 019를 999로 바꿔 출력하는 것이다.
특정 패턴이 있는 줄 출력
sed '/pattern/p' [파일 이름]
sed -n '/pattern/p' [파일 이름]
pattern이 있는 줄을 출력한다.
-n 옵션을 넣지 않으면 모든 파일의 내용을 출력하면서 pattern이 있는 줄을 두 줄씩 출력하고
-n 옵션을 넣으면 해당 패턴이 있는 줄만 출력한다.
줄 삭제
sed '숫자d' [파일 이름]
지정한 줄을 삭제한다.
아래는 data 파일에서 2번째 줄부터 4번째 줄까지 삭제한 것이다.
여러 명령을 한 번에 실행
-e 옵션을 주면 여러 명령을 한 번에 실행할 수 있다.
sed -e '명령' -e '명령' [파일 이름]
아래는 파일 내 019를 999로 모두 바꾸는 's/019/999/g' 명령과 6번째 줄 이후부터는 삭제하는 '6,$d' 명령을 한 번에 실행하는 것이다.