엔지니어로 살면서 로그(log)를 까보는 건 그야말로 일상다반사입니다. 장애가 발생했을 때나 시스템의 흐름을 파악해야 할 때 가장 먼저 찾게 되는 것이 바로 로그인데, 이때 수만 개의 파일 사이에서 원하는 데이터를 얼마나 빨리 찾아내느냐가 곧 엔지니어의 실력이자 ‘칼퇴’의 지름길입니다.
오늘은 파일 수색의 탐정 find, 내용 검색의 해결사 egrep, 그리고 이 둘을 이어주는 xargs를 통해 강력한 검색 한 줄을 만드는 법을 알아보겠습니다.
1. 파일 수색의 탐정: find
find는 파일 시스템의 모든 곳을 뒤져 조건을 만족하는 파일을 찾아냅니다.
- 기본적으로 꼭 알아야 할 옵션과 예시:
-name / -iname: 파일 이름으로 검색. (-iname은 대소문자 무시)
find . -name "server.log" (정확히 server.log 파일 찾기)
-type f / d: 파일(f)만 찾을지, 디렉토리(d)만 찾을지 결정.
find /etc -type d -name "nginx" (nginx라는 이름의 디렉토리 찾기)
-size: 용량으로 검색.
find . -size +100M (100MB 이상인 대용량 파일 수색)
- 내가 실무에서 자주 사용하는
-newermt: 숫자로 날짜를 계산해야 하는-mtime보다 훨씬 직관적입니다. 우리가 평소 읽는 날짜 형식을 그대로 쓸 수 있어 편리하지만, 사용 시 몇 가지 주의할 점이 있습니다.- 주의 1: 타임존(Timezone)의 함정 – 서버의 시스템 시간(UTC/KST 등)을 기준으로 작동합니다. 서버는 UTC인데 나는 한국 시간(KST)으로 검색하면 9시간의 오차가 발생해 로그를 놓칠 수 있습니다. 이럴 땐
"2024-01-01 09:00:00 KST"처럼 시간 뒤에 타임존을 명시하는 것이 가장 안전합니다.주의 2: 날짜 형식 –"yesterday","2 hours ago"같은 상대적인 시간 표현도 잘 알아듣지만, 정밀한 수색을 위해선YYYY-MM-DD HH:MM:SS형식을 권장합니다.
- 주의 1: 타임존(Timezone)의 함정 – 서버의 시스템 시간(UTC/KST 등)을 기준으로 작동합니다. 서버는 UTC인데 나는 한국 시간(KST)으로 검색하면 9시간의 오차가 발생해 로그를 놓칠 수 있습니다. 이럴 땐
# 2024년 1월 1일 09시 이후에 수정된 파일 찾기 (KST 기준)
find . -type f -newermt "2024-01-01 09:00:00 +0900"
2. 내용 검색의 해결사: egrep
파일을 찾았다면 이제 그 안의 텍스트를 훑어야 합니다. egrep은 정규표현식을 지원하여 복잡한 패턴도 척척 찾아냅니다.
- 기본적으로 꼭 알아야 할 옵션:
-i: 대소문자 구분 없이 검색.-v: 특정 단어가 포함되지 않은 줄만 출력 (필터링용).-A / -B / -C: 매칭된 줄의 전(Before), 후(After), 앞뒤(Center) 상황을 함께 출력하여 에러 전후 맥락을 파악할 때 유용합니다.
- 내가 자주 사용하는
--include: 검색 대상을 특정 확장자로 제한합니다. 바이너리나 이미지를 건너뛰고 오직 텍스트 파일만 타격하여 검색 속도를 비약적으로 높여줍니다.
# 모든 폴더 내 .log 파일 중에서만 "ERROR" 검색
egrep -r "ERROR" . --include="*.log"

3. 명령어 사이의 가교: xargs
find가 찾아낸 파일 목록을 egrep이나 다른 명령어에게 전달해 주는 배달 기사가 바로 xargs입니다.
자주 사용하는 명령어
- 대량의 임시 파일 삭제:
# 검색된 모든 .tmp 파일을 한 번에 삭제
find . -name "*.tmp" | xargs rm -f

- 찾은 파일을 특정 디렉토리로 이동 (
-I옵션 활용):
#{} 위치에 파일명을 하나씩 대입해 이동
find . -name "*.jpg" | xargs -I {} mv {} /data/images/

- 병렬 처리로 속도 높이기 (
-P옵션):
# 4개의 CPU 코어를 사용해 로그 파일들을 동시에 압축
find . -name "*.log" | xargs -P 4 gzip

- 주의할 점 (공백 처리): 파일 이름에 공백이 있으면 명령어가 깨질 수 있습니다. 이를 방지하기 위해
find의 **-print0**와xargs의 **-0**를 반드시 세트로 사용하는 습관을 들여야 합니다. 이 조합은 실제 운영 환경에서 여러분의 시스템을 지켜줄 소중한 방패가 됩니다.
4. [실습] 가상 수사 현장 만들기 (touch 활용)
이론을 배웠으니 직접 테스트 환경을 만들어 검증해 봅시다. touch의 -d 옵션을 쓰면 파일의 생성/수정 시간을 과거 시점으로 조작할 수 있어 테스트에 안성맞춤입니다.
# 1. 테스트용 디렉토리 생성
mkdir search_test && cd search_test
# 2. 2024년 1월 1일자로 된 과거 로그 파일 생성 (시간 조작)
touch -d "2024-01-01 10:00:00" old_error.log
# 3. 오늘 날짜로 된 최신 로그 파일 생성
touch current_debug.log
# 4. 파일 내용에 테스트 문구 삽입
echo "CRITICAL ERROR: Database connection failed" > old_error.log
echo "Normal debug message" > current_debug.log

5. 실무 종합 세트: “세 명령어를 섞으면 무적이 됩니다”
자, 이제 모든 지식을 하나로 합쳐서 아까 만든 가상 현장을 수사해 보겠습니다. **”2024년 이후 생성된 모든 .log 파일 중에서 ERROR라는 단어가 포함된 줄”**을 찾아봅시다.
# 1. find로 날짜 필터링 (-newermt)
# 2. xargs로 안전하게 전달 (-print0 / -0)
# 3. egrep으로 로그 파일 내 검색 (--include)
find . -type f -name "*.log" -newermt "2024-01-01" -print0 | xargs -0 egrep -i "ERROR" --include="*.log"

💡 엔지니어의 참견
“사실 저도 예전엔
xargs가 정확히 어떤 원리로 돌아가는지 잘 몰랐습니다. 그저 구글링해서 나오는 명령어를 영문도 모른 채 복사해서 붙여넣고, ‘어? 되네?’ 하고 넘어갔던 적이 많았죠. 하지만find가 찾은 목록을xargs라는 배달 기사가 다음 명령어의 입맛에 맞게 포장해서 넘겨준다는 원리를 알고 나니, 이제는 상황에 맞춰 명령어를 직접 조립할 수 있게 되었습니다.여러분도 단순히 복사 붙여넣기 하는 단계를 넘어,
touch로 직접 테스트 환경을 만들어 검증해보는 습관을 가져보세요. 특히-newermt사용 시 타임존을 명시하는 디테일까지 챙기게 된다면, 장애 상황에서 여러분의 판단은 누구보다 정확해질 것입니다.”
“이 글의 영문 버전은 [이곳]에서 확인하실 수 있습니다.”