터미널·서버 실무 · Part 2

찾기와 조합

검색 대신 손으로 찾아내는 능력의 핵심 익히기

작성 기준2026년 7월

이 파트에서 다루는 내용

내용 찾기 grep파일 찾기 find파이프로 연결리다이렉션
01

grep은 파일 안에서 내용을 찾습니다

grep 은 이 코스에서 가장 자주 쓰게 될 명령입니다. 파일 안에서 특정 문자열이 있는 줄을 찾아 줍니다. 로그에서 오류를 뽑을 때 손이 먼저 가는 도구입니다.

앞뒤 맥락이 핵심
-A -B -C

오류 한 줄만 봐서는 원인을 모릅니다. -A 와 -B 로 앞뒤를 함께 봐야 무슨 일이 있었는지 이어집니다. -C 는 앞뒤를 동시에 봅니다. 로그 분석에서 가장 많이 쓰는 옵션입니다.

제외 검색
-v

노이즈가 많을 때 유용합니다. DEBUG 로그를 빼고 보거나, 특정 정상 메시지를 제외하고 남은 것만 확인합니다.

grep "ERROR" app.logERROR 가 포함된 줄만 출력
grep -i "error" app.log대소문자 무시하고 검색
grep -n "ERROR" app.log줄 번호와 함께 출력
grep -r "TODO" src/디렉터리 안 모든 파일을 재귀 검색
grep -v "DEBUG" app.logDEBUG 가 없는 줄만 출력 (제외)
grep -c "ERROR" app.log일치하는 줄 개수만 세기
grep -A 3 "Exception" app.log일치한 줄 다음 3줄까지 함께 (After)
grep -B 3 "Exception" app.log일치한 줄 앞 3줄까지 함께 (Before)
02

find는 조건에 맞는 파일을 찾습니다

grep 이 파일 안을 본다면, find 는 파일 자체를 찾습니다. 이름, 수정 시간, 크기 같은 조건으로 찾을 수 있어 '어제 바뀐 설정 파일 찾기' 같은 일이 가능합니다.

조건을 겹쳐 씁니다
정밀 검색

이름과 수정 시간을 함께 주면 '어제 바뀐 conf 파일'처럼 좁힐 수 있습니다. 조건이 많을수록 정확히 찾습니다.

찾은 뒤 처리
-exec

find 로 찾은 파일에 바로 명령을 실행할 수 있습니다. 다만 삭제 같은 위험한 처리를 붙일 때는 먼저 목록만 출력해 확인한 뒤 실행합니다.

실무 시나리오
예시

디스크가 찼을 때 find 로 큰 파일과 오래된 로그를 찾아 확인하고 정리합니다. 어느 설정이 언제 바뀌었는지 추적할 때도 수정 시간으로 찾습니다.

find . -name "*.log"현재 위치 아래 모든 .log 파일
find /etc -name "*.conf"특정 경로에서 이름으로 찾기
find . -mtime -1최근 하루 안에 수정된 파일
find . -size +100M100MB 넘는 파일. 디스크 정리 때 유용
find . -type d -name "logs"logs 라는 이름의 디렉터리만
find /var/log -name "*.log" -mtime +3030일 넘은 오래된 로그 찾기
03

파이프가 도구를 조합해 새 도구를 만듭니다

터미널의 진짜 힘은 여기서 나옵니다. 파이프( | )는 한 명령의 출력을 다음 명령의 입력으로 연결합니다. 단순한 도구들을 이어 붙여 복잡한 질문에 답할 수 있습니다.

이것이 '검색 대신 스스로 답을 만든다'는 말의 실제 의미입니다. 정해진 명령을 외우는 것이 아니라, 필요한 답을 도구 조합으로 조립합니다.

자주 쓰는 조합 도구
정리
  • sort: 줄을 정렬 (-rn 은 숫자 내림차순)
  • uniq -c: 중복을 세어 개수 표시 (정렬 후 사용)
  • wc -l: 줄 수 세기
  • cut -d -f: 구분자로 나눠 특정 칸 추출
  • head / tail: 앞뒤 일부만
작게 나눠 확인
조립 요령

긴 파이프를 한 번에 짜지 않습니다. 앞부터 하나씩 실행해 결과를 확인하며 도구를 덧붙입니다. 어디서 틀렸는지 바로 보입니다.

파이프로 조립하기bash
# 로그에서 ERROR 만 뽑아 개수 세기
grep "ERROR" app.log | wc -l

# ERROR 를 뽑아 마지막 20건만 보기
grep "ERROR" app.log | tail -n 20

# 가장 많이 나온 오류 메시지 상위 5개
grep "ERROR" app.log | sort | uniq -c | sort -rn | head -n 5
#   │                    │      │         │          └ 상위 5개
#   │                    │      │         └ 개수 기준 내림차순 정렬
#   │                    │      └ 중복을 세어 개수 표시
#   │                    └ 같은 줄이 붙도록 정렬
#   └ ERROR 줄만 추출

# 접속 로그에서 IP별 요청 수 집계
grep "GET" access.log | cut -d " " -f 1 | sort | uniq -c | sort -rn

마지막 예시는 다섯 개의 단순 도구를 이어 'IP별 요청 순위'라는 답을 만들어 냅니다. 이런 조합을 스스로 짤 수 있으면 검색이 없어도 대부분 해결됩니다.

04

리다이렉션으로 결과를 저장하고 오류를 다룹니다

파이프가 명령끼리 연결한다면, 리다이렉션은 출력을 파일로 보내거나 파일에서 입력을 받습니다. 결과를 남기거나 오류만 따로 모을 때 씁니다.

표준 출력과 표준 오류
1과 2

정상 결과는 표준 출력(1), 오류 메시지는 표준 오류(2)로 나옵니다. 둘을 나누면 오류만 따로 모아 볼 수 있습니다. 2>&1 은 오류를 출력과 합치라는 뜻입니다.

tee 로 동시에
기록과 확인

긴 작업의 결과를 화면으로 보면서 파일로도 남기고 싶을 때 tee 를 씁니다. 배포나 설치 로그를 남길 때 유용합니다.

덮어쓰기 사고
주의

> 는 대상 파일을 먼저 비웁니다. cat a.log > a.log 처럼 같은 파일을 쓰면 내용이 날아갑니다. 덮어쓸 대상을 항상 확인합니다.

리다이렉션 기본bash
# 출력을 파일로 저장 (기존 내용 덮어씀)
grep "ERROR" app.log > errors.txt

# 파일 끝에 이어 붙이기 (덮어쓰지 않음)
grep "ERROR" today.log >> errors.txt

# 오류 출력(stderr)을 따로 보내기
./deploy.sh > result.log 2> error.log

# 정상 출력과 오류를 한 파일에 합치기
./deploy.sh > all.log 2>&1

# 화면에도 보이고 파일에도 저장 (tee)
./deploy.sh 2>&1 | tee run.log

> 는 덮어쓰고 >> 는 이어 붙입니다. 중요한 파일에 > 를 잘못 쓰면 원본이 사라지므로, 이어 붙일 때는 반드시 >> 를 씁니다.

핵심

grep 과 find 로 찾고, 파이프로 이어 붙이고, 리다이렉션으로 남깁니다. 이 네 가지 조합이 검색이 막힌 환경에서 스스로 답을 만드는 기본기입니다. 명령을 외우기보다 조립하는 감각을 기르는 것이 목표입니다.

체크

이 파트 완료 기준