동작하는 코드
예제 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을 리다이렉션합니다.
echo "1줄",echo "2줄",echo "3줄",echo "4줄",echo "5줄"을 차례로>>로lines.txt에 추가하세요.cat -n lines.txt로 줄 번호와 함께 확인하세요.head -3 lines.txt로 앞 3줄만,tail -2 lines.txt로 뒤 2줄만 출력하세요.wc -l lines.txt로 줄 수를 세세요.cat lines.txt | grep "줄"을 실행하고 결과를 확인하세요.
Q1. 기존 파일의 내용을 유지하면서 새 내용을 추가하는 올바른 리다이렉션은?
- A)
echo "내용" > 파일.txt - B)
echo "내용" >> 파일.txt - C)
echo "내용" | 파일.txt - D)
echo "내용" => 파일.txt