GNU/Linux 배포판에는 텍스트를 다루기 위한 방대한 프로그램들이 포함되어 있으며, 그중 상당수는 GNU 핵심 유틸리티(GNU coreutils)에서 제공합니다. 이러한 유틸리티들은 익히는 데 어느 정도 시간이 걸리지만, 올바르게 활용하면 텍스트 작업을 놀랍도록 빠르고 효율적으로 처리할 수 있습니다.
이 글에서는 모든 명령줄 사용자가 반드시 알아두어야 할 강력한 텍스트 처리 도구 13가지를 소개합니다.
1. cat
cat은 원래 여러 파일을 하나로 이어 붙이는(concatenate) 기능을 위해 만들어졌지만, 실제로는 단일 파일의 내용을 화면에 출력하는 용도로 가장 많이 사용됩니다. 인자 없이 실행하면 Ctrl + D를 누를 때까지 표준 입력을 읽어 들입니다(터미널에서 직접 입력하거나 파이프로 다른 프로그램의 출력을 받을 수 있습니다). 표준 입력은 - 기호로 명시적으로 지정할 수도 있습니다.
cat에는 유용한 옵션이 여러 가지 있는데, 대표적인 것들은 다음과 같습니다.
-A: 각 줄 끝에 "$"를 표시하고, 출력할 수 없는 문자를 캐럿(caret) 표기법으로 보여줍니다.-n: 모든 줄에 번호를 붙입니다.-b: 빈 줄을 제외한 줄에만 번호를 붙입니다.-s: 연속된 빈 줄을 하나의 빈 줄로 압축합니다.
다음 예제는 file1의 내용, 표준 입력, file3의 내용을 순서대로 연결하고 각 줄에 번호를 붙여 출력합니다.
cat -n file1 - file3
2. sort
이름 그대로 sort는 파일 내용을 사전순 또는 숫자순으로 정렬해 주는 도구입니다.
3. uniq
uniq는 정렬된 파일에서 중복된 줄을 제거합니다. 일반적으로 sort와 함께 파이프로 연결하여 한 번에 처리하는 경우가 많습니다.
4. comm
comm은 정렬된 두 파일을 한 줄씩 비교하는 도구입니다. 결과는 세 개의 열로 출력되며, 첫 번째 열에는 첫 번째 파일에만 있는 줄, 두 번째 열에는 두 번째 파일에만 있는 줄, 세 번째 열에는 두 파일에 공통으로 존재하는 줄이 표시됩니다.
5. cut
cut은 각 줄에서 특정 부분만 추출할 때 사용하는 도구로, 문자 위치, 필드, 바이트 단위로 지정할 수 있습니다. 파일을 지정하지 않으면 표준 입력에서 데이터를 읽어 들입니다.
문자 위치 기준으로 자르기
-c 옵션은 특정 문자 위치 하나 또는 하나 이상의 범위를 지정합니다.
예를 들면 다음과 같습니다.
-c 3: 세 번째 문자-c 3-5: 세 번째부터 다섯 번째까지의 문자-c -5또는-c 1-5: 첫 번째부터 다섯 번째까지의 문자-c 5-: 다섯 번째 문자부터 줄 끝까지-c 3,5-7: 세 번째 문자와 다섯 번째부터 일곱 번째까지의 문자
필드 기준으로 자르기
필드는 단일 문자로 구성된 구분자(delimiter)로 나뉘며, 구분자는 -d 옵션으로 지정합니다. 추출할 필드는 -f 옵션으로 선택하며, 위와 동일한 형식으로 위치나 범위를 지정할 수 있습니다.
6. dos2unix
GNU/Linux와 Unix는 일반적으로 줄 끝을 라인 피드(LF)로 처리하는 반면, Windows는 캐리지 리턴 + 라인 피드(CRLF)를 사용합니다. 따라서 Linux에서 CRLF 형식의 텍스트 파일을 다룰 때 호환성 문제가 발생할 수 있는데, 이때 dos2unix가 유용합니다. 이 도구는 CRLF 종결자를 LF로 변환해 줍니다.
다음 예제에서는 file 명령을 사용해 dos2unix 실행 전후의 텍스트 형식을 확인해 봅니다.
7. fold
긴 텍스트 줄을 더 읽기 쉽고 다루기 편하게 만들려면 fold를 사용해 지정한 너비에 맞게 줄을 바꿀 수 있습니다.
fold는 기본적으로 지정된 너비를 엄격하게 맞추며, 필요하면 단어 중간에서라도 줄을 끊습니다.
fold -w 30 longline.txt
단어가 중간에 잘리는 것이 싫다면 -s 옵션을 사용해 공백을 기준으로 줄을 바꾸도록 설정할 수 있습니다.
fold -w 30 -s longline.txt
8. iconv
iconv는 텍스트의 문자 인코딩을 다른 인코딩으로 변환하는 도구로, 특수한 인코딩의 파일을 다룰 때 매우 유용합니다.
iconv -f input_encoding -t output_encoding -o output_file input_file
- "input_encoding": 변환 전 원본 인코딩입니다.
- "output_encoding": 변환할 대상 인코딩입니다.
- "output_file": iconv가 결과를 저장할 파일 이름입니다.
- "input_file": iconv가 읽어 들일 파일 이름입니다.
참고: iconv -l 명령으로 사용 가능한 인코딩 목록을 확인할 수 있습니다.
9. sed
sed는 강력하고 유연한 스트림 에디터(stream editor)로, 가장 흔히 아래와 같은 문법으로 문자열을 찾아 바꾸는(find and replace) 작업에 사용됩니다.
다음 명령은 지정한 파일(또는 표준 입력)을 읽어 정규 표현식 패턴과 일치하는 부분을 치환 문자열로 교체한 뒤, 그 결과를 터미널에 출력합니다.
sed s/pattern/replacement/g filename
원본 파일 자체를 수정하려면 -i 플래그를 사용하면 됩니다.
10. wc
wc 유틸리티는 파일의 바이트 수, 문자 수, 단어 수 또는 줄 수를 출력합니다.
11. split
split을 사용하면 하나의 파일을 더 작은 파일들로 분할할 수 있습니다. 줄 수 기준, 크기 기준, 또는 지정한 개수의 파일로 나눌 수 있습니다.
줄 수 기준으로 분할하기
split -l num_lines input_file output_prefix
바이트 기준으로 분할하기
split -b bytes input_file output_prefix
지정한 개수의 파일로 분할하기
split -n num_files input_file output_prefix
12. tac
tac은 이름 그대로 cat을 거꾸로 쓴 것으로, 실제로 그런 기능을 합니다. 파일의 내용을 줄 단위로 역순으로 뒤집어 출력해 줍니다.
13. tr
tr 도구는 문자 집합(set)을 변환하거나 삭제하는 데 사용됩니다.
문자 집합은 일반적으로 문자열 또는 문자 범위로 지정합니다. 예를 들면 다음과 같습니다.
- "A-Z": 모든 대문자
- "a-z0-9": 소문자와 숫자
- "\n[:punct:]": 줄바꿈 문자와 문장 부호
자세한 내용은 tr 매뉴얼 페이지를 참고하세요.
한 문자 집합을 다른 집합으로 변환하려면 다음 문법을 사용합니다.
tr SET1 SET2
예를 들어 소문자를 대응하는 대문자로 바꾸려면 다음과 같이 실행합니다.
tr "a-z" "A-Z"
특정 문자 집합을 삭제하려면 -d 플래그를 사용합니다.
tr -d SET
반대로 지정한 집합을 제외한 나머지 문자(즉, 집합의 여집합)를 삭제하려면 -dc를 사용합니다.
tr -dc SET
마무리
리눅스 명령줄에서 배울 내용은 무궁무진합니다. 위에서 소개한 명령어들이 명령줄에서 텍스트를 더 능숙하게 다루는 데 도움이 되기를 바랍니다.