cat과 tac 명령어는 단순한 텍스트 파일 표시 도구처럼 보이지만, 그 이상의 기능을 제공합니다. 이 두 명령어를 깊이 파고들어 리눅스 명령줄 활용법을 익혀 생산성을 높여봅시다.
이 명령어들은 너무 간단해서 종종 그 진가를 간과하기 쉽습니다. 하지만 파일 처리 방법을 다양하게 익히면, 파일 관련 작업을 훨씬 효율적으로 처리할 수 있습니다.
고양이(cat) 명령어 상세 분석
cat 명령어는 주로 텍스트 파일 내용을 확인하거나, 여러 파일을 결합하여 하나의 큰 파일로 만드는 데 사용됩니다. 자세히 알아보기
과거 모뎀 통신 시절, 파일 다운로드의 편의성을 위해 이진 파일은 여러 개의 작은 조각으로 나뉘어 전송되었습니다. 하나의 큰 파일을 다운로드하는 대신, 작은 파일들을 여러 번 다운로드하여 다시 합치는 방식이었습니다. 만약 다운로드 실패 시, 해당 조각만 재전송하면 됐습니다.
이러한 작은 조각들을 다시 하나의 파일로 합치는 과정이 바로 연결(concatenate)이었고, 여기서 cat이라는 이름이 유래되었습니다.
광대역 인터넷 시대가 되면서 과거의 모뎀 연결 방식은 더 이상 사용되지 않지만, cat 명령어는 여전히 유용하게 활용됩니다.
텍스트 파일 내용 출력
터미널 창에 텍스트 파일 내용을 표시하려면 다음과 같이 cat 명령어를 사용합니다.
주의: 이진 파일 내용을 터미널 창에 출력하려고 하면 예기치 않은 결과가 발생할 수 있습니다. 최악의 경우 터미널 세션이 잠길 수도 있습니다. 반드시 텍스트 파일에만 사용해야 합니다.
cat poem1.txt
위 명령어를 실행하면 poem1.txt 파일의 내용이 터미널 창에 표시됩니다.
만약 파일이 여러 개라면, 명령줄에 파일들을 순서대로 나열하면 됩니다. 아래 예시는 poem1.txt와 poem2.txt의 내용을 함께 출력합니다.
cat poem1.txt poem2.txt
이제 poem1.txt와 poem2.txt의 전체 내용을 확인할 수 있습니다.
cat 명령어의 다양한 활용법
만약 시의 내용이 너무 빨리 지나가서 읽기 어렵다면, cat 명령어의 출력을 less 명령어와 파이프(|)로 연결하여 내용을 스크롤하면서 볼 수 있습니다.
cat poem1.txt poem2.txt | less
이렇게 하면 여러 파일에 분산된 텍스트를 하나의 흐름으로 쉽게 읽을 수 있습니다.
텍스트 파일 줄 번호 매기기
cat 명령어에 -n 옵션을 사용하면 텍스트 파일의 각 줄에 번호를 매겨 출력할 수 있습니다.
cat -n poem1.txt
터미널 창에 표시되는 대로 줄 번호가 매겨집니다.
빈 줄은 제외하고 줄 번호 매기기
만약 빈 줄을 제외하고 텍스트가 있는 줄에만 번호를 매기고 싶다면, -b 옵션을 사용하면 됩니다.
cat -b poem1.txt
이제 텍스트가 있는 줄에만 번호가 매겨지고 빈 줄은 건너뜁니다.
연속된 빈 줄 압축하기
파일에 연속된 빈 줄이 여러 개 있다면, -s 옵션을 사용해 하나의 빈 줄만 남기고 나머지는 삭제할 수 있습니다.
다음 명령어를 사용하면 연속된 빈 줄이 하나의 빈 줄로 압축되어 출력됩니다.
cat -s poem1.txt
이 옵션은 파일 내용 자체를 변경하지 않고, 단순히 출력 결과만 변경합니다.
탭 문자 표시
공백이 스페이스바를 눌러서 생성된 것인지, 탭키를 눌러서 생성된 것인지 확인하고 싶을 때, -T 옵션을 사용하면 탭 문자를 “^I”로 표시해줍니다.
cat -T poem1.txt
탭 문자는 “^I”로 표시됩니다.
줄 끝 표시
-E 옵션을 사용하면 줄의 끝을 “$” 문자로 표시하여 후행 공백을 쉽게 확인할 수 있습니다.
cat -E poem1.txt
줄의 끝은 “$” 문자로 표시됩니다.
파일 결합하기
두 개의 시 파일을 하나로 합쳐서 전체 시가 담긴 새로운 파일을 만들어 봅시다.
cat poem1.txt poem2.txt > jabberwocky.txt
cat 명령어로 새 파일 내용을 확인해봅시다.
cat jabberwocky.txt
이제 새 파일에는 두 개의 파일 내용이 모두 들어있습니다.
기존 파일에 텍스트 추가하기
새로운 파일에 텍스트를 추가하고 싶다면 “>>” 연산자를 사용해야 합니다. 만약 “>” 연산자를 사용하면 기존 파일 내용을 덮어쓰게 됩니다.
cat first_verse.txt >> jabberwocky.txt
이제 jabberwocky.txt 파일의 내용을 확인해 보면:
cat jabberwocky.txt
이제 시 전체 내용이 모두 한 파일에 모였습니다.
표준 입력 리디렉션
cat 명령어를 사용하여 키보드로 입력한 내용을 파일로 리디렉션할 수도 있습니다. 입력한 내용은 Ctrl+D를 누를 때까지 파일로 저장됩니다. 새로운 파일을 만들거나 기존 파일을 덮어쓰기 위해 “>” 연산자를 사용합니다.
cat > my_poem.txt
명령어를 실행한 후 바로 텍스트 입력을 시작할 수 있습니다. 입력을 마치면 Ctrl+D를 누릅니다. 새로 생성된 파일의 내용을 확인해 봅시다.
cat my-poem.txt
택(tac) 명령어 소개
tac 명령어는 cat 명령어와 비슷하지만, 파일 내용을 역순으로 출력합니다. 자세히 알아보기
아래 예시를 봅시다.
tac my_poem.txt
파일 내용이 역순으로 터미널 창에 출력됩니다.
표준 입력과 함께 tac 명령어 사용
파일 이름 없이 tac 명령어를 사용하면, 키보드 입력으로부터 내용을 받아 처리합니다. Ctrl+D를 누르면 입력이 중단되고, tac 명령어는 입력받은 내용을 역순으로 출력합니다.
tac
Ctrl+D를 누르면 입력한 내용이 반전되어 터미널 창에 출력됩니다.
로그 파일과 함께 tac 명령어 사용
tac 명령어는 최신 항목이 파일 맨 아래에 추가되는 로그 파일을 분석할 때 유용하게 사용할 수 있습니다. tac 명령어와 head 명령어를 함께 사용하면 로그 파일의 마지막 항목을 쉽게 확인할 수 있습니다.
syslog 파일을 tac 명령어를 사용해 역순으로 출력하고, 그 출력을 head 명령어에 파이프합니다. head 명령어는 가장 첫 번째 줄만 출력하기 때문에, tac 덕분에 syslog 파일의 가장 최신 항목을 볼 수 있습니다.
tac /var/log/syslog | head -1
head 명령어는 요청한 대로 한 줄만 출력하지만, 내용이 너무 길어 두 줄에 걸쳐 표시될 수 있습니다.
텍스트 레코드와 함께 tac 명령어 사용
tac 명령어의 마지막 활용법은 데이터를 덩어리(레코드)로 취급하여 역순으로 처리하는 것입니다. tac 명령어는 일반적으로 줄 단위로 파일을 처리하지만, 구분자를 설정하여 특정 단위로 파일을 처리할 수 있습니다.
분석해야 하는 프로그램 로그 파일이 있다고 가정해 보겠습니다.
less logfile.dat
파일에는 반복되는 형식이 있습니다. 16진수 값 3줄, 그리고 “=SEQ”로 시작하는 레이블 줄이 반복됩니다. 16진수 자세히 알아보기
파일을 아래로 스크롤하면, 이러한 레코드가 많이 있음을 알 수 있습니다. 마지막 번호는 865입니다.
이제 이 파일을 데이터 레코드 별로 역순으로 처리해야 한다고 가정해 봅시다. 각 데이터 레코드 안의 3개의 16진수 값 순서는 유지되어야 합니다.
파일의 마지막 세 줄은 16진수 값 93, E7, B8로 시작됩니다.
tac 명령어를 사용해 파일을 역순으로 만들어 보겠습니다. 파일이 너무 길기 때문에 less 명령어와 파이프를 사용하겠습니다.
tac logfile.dat | less
파일은 반전되었지만 우리가 원하는 결과는 아닙니다. 파일이 반전되길 원하지만, 각 데이터 레코드의 줄 순서는 그대로 유지되어야 합니다.
파일의 마지막 세 줄(16진수 값 93, E7, B8로 시작하는 줄)의 순서가 뒤집혔습니다. 또한 “=SEQ” 라인은 3개의 16진수 라인의 각 세트 아래에 위치합니다.
이제 구조화된 tac 명령어를 사용해 보겠습니다.
tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less
분석해 봅시다.
- -s (구분자) 옵션은 tac 명령어에 레코드 사이의 구분자로 사용할 내용을 알려줍니다.
- -r (regex) 옵션은 tac 명령어에 구분자 문자열을 정규 표현식으로 해석하도록 합니다. 정규 표현식 자세히 알아보기
- -b (이전) 옵션은 tac 명령어에 구분 기호를 각 레코드 뒤(기본 구분 기호인 줄바꿈 문자 위치) 대신 앞에 출력하도록 합니다.
-s (구분자) 문자열인 ^=SEQ.+[0-9]+*$는 다음과 같이 해석됩니다:
^ 문자는 줄의 시작을 나타냅니다. 그 뒤에 “=SEQ”가 옵니다. 뒤에는 숫자 시퀀스([0-9]로 표시)와 다른 문자 집합이 옵니다 (*$로 표시됨).
이제 결과를 확인해 보겠습니다.
이제 파일은 각 “=SEQ” 레이블 줄 앞에 16진수 데이터 세 줄이 표시되어 역순으로 출력됩니다. 각 데이터 레코드 내에서 16진수 세 줄의 순서는 유지됩니다.
16진수의 첫 세 줄의 첫 번째 값은 이전에 기록했던 대로 93, E7, B8 순서와 일치함을 알 수 있습니다.
모든 것에는 목적이 있다
리눅스 세계에서는 가장 단순해 보이는 명령어와 유틸리티조차도 놀랍고 강력한 기능을 가질 수 있습니다.
단순한 유틸리티의 설계 철학은 “한 가지 일을 잘하는 것”입니다. 이러한 철학에 따라 만들어진 tac과 같은 명령어는 언뜻 보기에는 이상해 보일 수 있지만, 그 숨겨진 힘을 발견하면 다양한 용도로 활용할 수 있습니다. Unix 철학 자세히 알아보기
또는 다른 격언처럼, “뱀이 뿔이 없다고 얕보지 말라. 누가 그것이 용이 되지 않을 것이라고 말할 수 있겠는가?”