DaleSchool

파일 내용 보기

입문25분

학습 목표

  • cat으로 파일 전체 내용을 출력할 수 있다
  • head, tail로 파일의 일부분만 볼 수 있다
  • 리다이렉션(>, >>)으로 출력을 파일에 저장할 수 있다
  • 파이프(|)와 리다이렉션의 차이를 설명할 수 있다

동작하는 코드

예제 1: cat으로 파일 읽기

먼저 연습용 파일을 만들겠습니다:

echo "첫 번째 줄" > sample.txt
echo "두 번째 줄" >> sample.txt
echo "세 번째 줄" >> sample.txt
echo "네 번째 줄" >> sample.txt
echo "다섯 번째 줄" >> sample.txt

파일 읽기:

cat sample.txt

출력:

첫 번째 줄
두 번째 줄
세 번째 줄
네 번째 줄
다섯 번째 줄

줄 번호와 함께 보기:

cat -n sample.txt

출력:

     1	첫 번째 줄
     2	두 번째 줄
     3	세 번째 줄
     4	네 번째 줄
     5	다섯 번째 줄

예제 2: 파일의 앞/뒤만 보기

# 앞 3줄만
head -3 sample.txt

출력:

첫 번째 줄
두 번째 줄
세 번째 줄
# 뒤 2줄만
tail -2 sample.txt

출력:

네 번째 줄
다섯 번째 줄

예제 3: wc로 파일 통계 보기

wc -l sample.txt

출력:

       5 sample.txt
# 여러 파일의 줄 수 비교
wc -l sample.txt Documents/notes.md

출력:

       5 sample.txt
       3 Documents/notes.md
       8 total

직접 수정하기

리다이렉션: 출력을 파일로 보내기

>>>는 명령어의 출력(stdout)을 파일로 보냅니다.

# > : 파일에 쓰기 (기존 내용 덮어씀)
echo "안녕하세요" > greeting.txt
cat greeting.txt

출력:

안녕하세요
# >> : 파일에 추가 (기존 내용 보존)
echo "반갑습니다" >> greeting.txt
echo "환영합니다" >> greeting.txt
cat greeting.txt

출력:

안녕하세요
반갑습니다
환영합니다

차이 정리:

  • > : 파일을 새로 씀 (기존 내용 사라짐)
  • >> : 파일 끝에 추가 (기존 내용 유지)

파이프: 출력을 다음 명령어의 입력으로

파이프(|)는 왼쪽 명령어의 출력을 오른쪽 명령어의 입력으로 전달합니다.

# cat 출력을 grep에 전달
cat Documents/notes.md | grep "항목"

출력:

- 항목 1
- 항목 2
# ls 출력의 줄 수 세기
ls | wc -l

출력:

       6

"왜?" — 파이프 vs 리다이렉션

둘 다 데이터를 "보내는" 것이지만 방향이 다릅니다:

파이프(|):         명령어 → 명령어 (데이터가 프로그램으로 감)
리다이렉션(>):     명령어 → 파일   (데이터가 파일로 저장됨)
리다이렉션(>>):    명령어 → 파일   (파일에 추가)

예시로 비교:

# 파이프: ls 출력을 grep에 전달 (화면에 출력)
ls | grep ".txt"

# 리다이렉션: ls 출력을 파일에 저장
ls > file-list.txt

# 조합: ls → grep으로 필터 → 파일에 저장
ls | grep ".txt" > txt-list.txt

상황에 맞는 파일 읽기 명령어 선택

| 명령어 | 언제 쓰나 | 실무 예시 | | --------- | -------------------- | ------------------------ | | cat | 짧은 파일 전체 확인 | 설정 파일, 짧은 로그 | | head | 파일 앞부분만 | CSV 헤더 확인, 로그 시작 | | tail | 파일 뒷부분만 | 최신 로그 확인 | | tail -f | 실시간 로그 모니터링 | 서버 로그 추적 | | wc -l | 줄 수 세기 | 로그 양, 파일 크기 파악 |

실무에서 head와 tail 활용

# 로그 파일의 최신 10줄 (기본값)
tail /var/log/system.log

# 최신 50줄
tail -50 /var/log/system.log

# 실시간으로 계속 추적
tail -f /var/log/system.log

# CSV 파일의 헤더(첫 줄)만 확인
head -1 data.csv

흔한 실수

실수 1: >로 덮어쓰기

echo "중요한 내용" > notes.txt
# ... 나중에 ...
echo "새 내용" > notes.txt   # 앞의 내용이 사라짐!

파일에 추가하려면 항상 >>를 쓰세요. 기존 내용을 보존하고 싶을 때는 >>가 기본입니다.

실수 2: cat으로 큰 파일 열기

cat /var/log/system.log   # 수만 줄이 한번에 출력됨

큰 파일은 less로 스크롤하거나, head/tail로 일부만 보세요.

실수 3: 파이프 방향 헷갈리기

# 올바름: 왼쪽 → 오른쪽
cat file.txt | grep "단어"

# 잘못됨: 이런 사용법은 없음
grep "단어" | cat file.txt

파이프는 항상 왼쪽에서 오른쪽으로 흐릅니다.

심화 학습

less로 긴 파일 스크롤하기

less는 큰 파일을 페이지 단위로 볼 수 있는 뷰어입니다:

less /etc/hosts

less 안에서의 조작:

  • ↑↓ 또는 j/k — 한 줄씩 이동
  • Space — 한 페이지 아래
  • b — 한 페이지 위
  • G — 파일 끝으로
  • 1G 또는 gg — 파일 처음으로
  • /검색어 — 검색 (n으로 다음, N으로 이전)
  • q — 종료

cat은 내용을 모두 출력하고 끝나지만, less는 대화형으로 탐색할 수 있습니다.

여러 파일 연결하기 (cat의 원래 용도)

cat은 conCATenate(연결)의 약자입니다:

# 두 파일 내용을 합쳐서 출력
cat file1.txt file2.txt

# 두 파일을 합쳐서 새 파일로
cat file1.txt file2.txt > combined.txt

이게 cat의 원래 용도입니다. 파일 읽기에 자주 쓰이지만 사실은 "연결해서 stdout으로 출력"하는 명령어입니다.

stderr: 에러 메시지 분리

명령어의 출력은 두 종류입니다:

  • stdout (표준 출력, 정상 결과)
  • stderr (표준 에러, 에러 메시지)
# stderr를 파일로 보내기
command 2> error.log

# stdout과 stderr 모두 파일로
command > output.log 2>&1

# stdout과 stderr를 각각 다른 파일로
command > output.log 2> error.log

2>는 stderr를, >는 stdout을 리다이렉션합니다.

  1. echo "1줄", echo "2줄", echo "3줄", echo "4줄", echo "5줄"을 차례로 >>lines.txt에 추가하세요.
  2. cat -n lines.txt로 줄 번호와 함께 확인하세요.
  3. head -3 lines.txt로 앞 3줄만, tail -2 lines.txt로 뒤 2줄만 출력하세요.
  4. wc -l lines.txt로 줄 수를 세세요.
  5. cat lines.txt | grep "줄"을 실행하고 결과를 확인하세요.

Q1. 기존 파일의 내용을 유지하면서 새 내용을 추가하는 올바른 리다이렉션은?

  • A) echo "내용" > 파일.txt
  • B) echo "내용" >> 파일.txt
  • C) echo "내용" | 파일.txt
  • D) echo "내용" => 파일.txt