Devin.KR
로그인

리눅스 cat 명령어 사용법 - 파일 내용 출력과 이어붙이기 실전 예제

개발자 조회 2

이 명령어를 언제 쓰는가

서버에 들어가서 가장 먼저 치는 명령이 대개 cat 이다. nginx 설정이 어떻게 들어가 있는지, 배포 스크립트가 무슨 환경 변수를 읽는지 확인할 때 파일을 통째로 화면에 뿌린다. 이름은 concatenate(이어붙이기)의 줄임말이고, 실제로 여러 파일을 하나로 합치는 용도로도 쓴다.

다만 cat 은 짧은 파일 전용이다. 수백 MB짜리 로그를 cat 하면 터미널이 몇 분간 멈춘다. 로그는 lesstail 을 쓴다.

기본 형식

cat [옵션] 파일1 [파일2 ...]

파일을 여러 개 주면 순서대로 이어서 출력한다. 파일명을 아예 주지 않거나 - 를 주면 표준 입력을 읽는다. 그래서 파이프의 시작점으로도 쓸 수 있다.

자주 쓰는 옵션

옵션의미예시
-n모든 줄에 행 번호를 붙인다cat -n /etc/hosts
-b비어 있지 않은 줄에만 번호를 붙인다cat -b script.sh
-s연속된 빈 줄을 한 줄로 줄인다cat -s config.yml
-A탭·개행·비출력 문자를 눈에 보이게 표시 (GNU 전용)cat -A Makefile
-e줄 끝에 $ 를 찍는다. 뒤쪽 공백 확인용cat -e list.txt

macOS·BSD 의 cat 에는 -A 가 없다. 대신 cat -vet 을 쓰면 같은 결과를 얻는다.

실전 예제

1) 설정 파일을 행 번호와 함께 확인한다. 오류 메시지가 "line 42" 라고 알려줄 때 바로 대조할 수 있다.

cat -n /etc/nginx/nginx.conf

2) 나뉘어 있는 로그 조각을 하나로 합친다. 로테이션된 로그를 날짜 순으로 이어붙여 분석용 파일을 만든다.

cat access.log.3 access.log.2 access.log.1 access.log > all-access.log

3) 히어독으로 설정 파일을 즉석에서 만든다. 에디터를 열기 애매한 자동화 스크립트 안에서 자주 쓴다.

cat > /etc/systemd/system/myapp.service <<'EOF'
[Unit]
Description=My App

[Service]
ExecStart=/usr/local/bin/myapp
Restart=always

[Install]
WantedBy=multi-user.target
EOF

구분자를 'EOF' 처럼 따옴표로 감싸면 내용 안의 $VAR 가 치환되지 않고 그대로 들어간다.

4) 윈도우에서 넘어온 파일의 개행 문자를 확인한다. 셸 스크립트가 bad interpreter 오류를 낼 때 원인의 90%가 이것이다.

cat -A deploy.sh | head -3

줄 끝이 ^M$ 로 보이면 CRLF 파일이다. dos2unix deploy.sh 로 고친다.

5) 여러 파일의 내용을 한 번에 grep 한다. 어느 파일에서 나왔는지가 중요하지 않을 때 쓴다.

cat /etc/nginx/conf.d/*.conf | grep -n 'proxy_pass'

함정과 주의점

입력 파일과 출력 파일을 같게 쓰면 파일이 날아간다. 셸은 명령을 실행하기 전에 리다이렉션 대상을 먼저 비운다. 아래는 파일을 0바이트로 만드는 명령이다.

cat app.log > app.log     # app.log 의 내용이 전부 사라진다

파일을 가공해서 제자리에 저장하려면 임시 파일을 거치거나 sponge(moreutils) 를 쓴다.

바이너리 파일을 cat 하면 터미널이 깨진다. 제어 문자가 그대로 전송되어 글자가 안 보이거나 입력이 이상해진다. 이때는 아무것도 안 보여도 reset 을 입력하고 엔터를 치면 복구된다. 애초에 파일 종류를 모르면 file 파일명 으로 먼저 확인한다.

대용량 파일에 cat 을 쓰지 않는다. 수 GB 로그를 cat 하면 터미널이 응답을 멈추고, SSH 세션이라면 네트워크까지 함께 막힌다. 이미 실행했다면 Ctrl-C 로 끊는다.

cat 한 결과를 파이프로 넘기는 습관은 대개 불필요하다. cat a.log | grep ERRORgrep ERROR a.log 로 충분하다. 프로세스가 하나 줄고, grep 이 파일명을 알기 때문에 여러 파일을 줄 때 어느 파일인지도 표시해 준다.

함께 보면 좋은 명령어

  • less — 큰 파일을 화면 단위로 넘겨 보고, 안에서 검색까지 할 수 있다.
  • tac — cat 을 거꾸로. 파일을 마지막 줄부터 출력한다. 로그를 최신순으로 볼 때 쓴다. GNU coreutils 라 macOS 에는 없고, 거기서는 tail -r 가 같은 일을 한다.
  • head — 파일이 어떤 형식인지만 확인하고 싶을 때 앞부분 몇 줄만 뽑는다.