본문 바로가기
리눅스/기초 학습

Day 2: 텍스트 출력 & 필터링

by CBROJIN 2025. 7. 21.

1) 학습 요약표

학습내용 설명
파일 출력 cat, more(/검색, n, -N), less(/검색, n, -N)
부분 출력 head(-n), tail(-n, -f, -F 로그 실시간/교체 추적)
단순 출력/시간 echo, date
텍스트 필터링 grep(-i, -v, -n, -E 정규식, -w), cut(-d, -f), paste, wc(-l), sort(-r, -n), uniq(-c)
로그 분석 활용 tail -F와 grep, wc, cut, paste 조합으로 실시간 분석
 

2) 이론 설명

(1) cat – 파일 내용 출력 및 연결

  • 기능: 파일의 내용을 표준 출력(터미널)에 출력하거나, 여러 파일을 연결해 출력.
  • 동작 원리: 파일 내용을 읽어 버퍼에 저장한 후 표준 출력으로 보냄.
  • 주요 옵션: 없음 (다른 명령어와 파이프(|)로 결합해 활용)

예제:

cat /var/log/syslog | grep -i error
cat part1.txt part2.txt
cat part1.txt part2.txt > merged.txt
  • /var/log/syslog 파일 내용을 출력하고, 대소문자 구분 없이(error/ERROR) 검색.
  • 두 파일을 이어서 한 번에 출력
  • 여러 파일을 하나로 합쳐서 새로운 파일로 저장

해설:

  1. cat /var/log/syslog: 시스템 로그 파일 출력 / | grep -i error: 출력 결과 중 error 키워드 필터링.
  2. part1.txt 내용과 part2.txt 내용을 순서대로 이어서 터미널에 출력.
  3. part1.txt와 part2.txt를 이어 붙여 merged.txt라는 새 파일 생성, 기존 merged.txt가 있으면 덮어씀.

 

(2) more & less – 페이지 단위 출력

  • 기능: 긴 파일을 페이지 단위로 나눠서 출력, 검색(/), 다음 검색(n), 줄 번호(-N) 지원.
  • 차이점: less는 위아래 스크롤 가능, more는 아래로만.

예제:

less -N /etc/passwd
  • /etc/passwd를 줄 번호와 함께 열고 /root 검색 가능.
  • /error 입력 후 Enter → 첫 번째 "error"로 이동.
  • n → 다음 "error"로 이동.
  • N → 이전 "error"로 이동.
  • q → 종료.

(3) head & tail – 특정 라인 출력

  • 기능: 파일의 앞부분 또는 뒷부분을 지정한 라인 수 만큼 출력.
  • 주요 옵션:
    • -n <숫자>: 출력할 줄 수 지정.
    • tail -f: 파일이 추가되는 내용을 실시간 출력.
    • tail -F: 로그 파일이 교체(rotated)되어도 추적 유지.
    • 두 옵션 모두 종료할 땐 Ctrl + C

예제:

tail -F /var/log/auth.log | grep -i fail
head -n 3 /etc/passwd /etc/group
  • 인증 로그를 실시간 추적하며, fail(실패) 키워드 감시.
  • 여러 파일 한꺼번에 확인

 

(4) echo & date – 단순 출력과 시간 확인

  • echo: 문자열 출력, 환경변수 출력.
  • -e : 기본적으로 echo는 문자열을 있는 그대로 출력.
    그런데 -e 옵션을 붙이면, 문자열 안에 있는 이스케이프 문자들(\n, \t, \\, \a 등)을 특수한 의미로 처리.
  • date: 현재 시스템 시간 출력.

예제:

echo "현재 시간: $(date)"
  • 현재 시간을 포함한 문자열 출력.

 

(5) grep – 패턴 검색

  • 기능: 파일에서 특정 문자열 또는 패턴을 검색.
  • 주요 옵션:
    • -i: 대소문자 무시.
    • -v: 패턴 제외.
    • -n: 줄 번호 출력.
    • -E: 정규식 사용.
    • -w: 단어 단위 매칭.

예제:

grep -i error /var/log/syslog
grep -v "127.0.0.1" access.log
  • syslog에서 대소문자 구분 없이 "error"가 들어간 줄만 출력.
  • access.log에서 127.0.0.1이 포함된 줄을 제외하고 나머지만 출력.

 

(6) cut & paste – 열 단위 처리

cut:

  • 기능 : 파일이나 입력 스트림을 구분자(-d)로 나눠서, 특정 필드(-f)만 추출. 주로 CSV, 로그, /etc/passwd 같은 구분자 기반 파일에서 특정 열만 뽑을 때 사용.
# /etc/passwd에서 사용자명과 홈 디렉토리만 추출
cut -d: -f1,6 /etc/passwd
  • -d: → 콜론(:)을 구분자로 사용
  • -f1,6 → 첫 번째 필드(사용자명)와 여섯 번째 필드(홈 디렉토리) 출력

paste:

  • 기능: 여러 파일을 가로로(열 단위로) 병합하거나, 입력 스트림을 한 줄로 합쳐서 출력. 간단한 데이터 조합, 컬럼 합치기 등에 활용.
paste -d "," file1.txt file2.txt
paste -s file.txt
  • -d 구분자 : 기본은 탭(tab)으로 열을 구분하지만, 원하는 구분자로 바꿀 수 있다.
  • -s : 입력된 모든 라인을 세로(행 단위)로 이어붙이지 않고, 가로(한 줄)로 이어붙임. → file.txt의 모든 줄을 한 줄로 합쳐 출력.

 

(7) wc, sort, uniq – 데이터 카운트 및 정렬

 

wc -l 기능: 표준 입력 또는 파일의 총 줄(line) 수를 계산.

예제:

wc -l /var/log/syslog
  • syslog 파일의 총 줄(line) 개수를 출력.

 

sort 기능: 데이터를 숫자 기준으로 내림차순(-r) 정렬, -n은 숫자 값 기준으로 비교.

예제:

cat scores.txt | sort -r -n
  • -n: 숫자 값으로 정렬 (문자열이 아닌 숫자 기준)
  • -r: 내림차순(큰 값 → 작은 값)

 

uniq 기능: 연속된 중복 항목을 하나로 묶어 출력하며, 각 항목의 개수를 앞에 표시.

예제:

cat access.log | cut -d' ' -f1 | sort | uniq -c | sort -r -n
  • -c : 각 줄이 몇 번 나왔는지 횟수를 세어 앞에 표시.
  • -d : 중복된 줄만 출력 (중복 횟수가 2번 이상인 줄).
  • -u : 한 번만 등장한 줄(고유한 줄)만 출력.

 

3) 기본 실습 과제

 

문제 1. 로그 분석 상황 만들기

  1. /tmp/log_practice 디렉토리를 만들고 이동하라.
  2. echo와 date를 사용하여 log1.txt, log2.txt에 5줄씩 임의의 로그와 현재 시간을 기록하라.
  3. 두 파일을 cat으로 합쳐 all.log로 저장하고, 합쳐진 줄 수를 확인하라.

 

문제 2. 페이지와 부분 출력 활용

  1. all.log 파일을 less로 열고 "error" 문자열을 검색 후 다음(n)/이전(N)으로 이동해본다.
  2. all.log 파일의 첫 3줄과 마지막 2줄을 각각 출력하라.

 

문제 3. 실시간 로그 모니터링

  1. 새로운 터미널에서 log3.txt를 만들고, 다른 터미널에서 tail -f로 추적하라.
  2. 첫 번째 터미널에서 echo를 사용해 log3.txt에 "warning"과 "ok" 메시지를 3번씩 기록하라.
  3. tail 모니터링 중 grep을 활용해 "warning"만 실시간으로 필터링하라.

 

문제 4. 텍스트 필터링과 데이터 가공

  1. all.log 파일에서 대소문자 구분 없이 "error"가 없는 줄만 출력하라.
  2. log1.txt와 log2.txt에서 1열과 3열을 cut으로 추출 후, paste로 하나의 CSV 형식으로 합쳐라.

 

문제 5. 데이터 집계 및 정렬 심화

  1. echo를 사용해 access_data.txt 파일을 만들고, 5개의 IP 주소와 각기 다른 점수를 공백으로 구분해 기록하라.
  2. echo를 사용해 score_data.txt 파일을 만들고, 5명의 이름과 점수를 공백으로 구분해 기록하라.
  3. access_data.txt에서 IP만 추출해 등장 횟수를 uniq로 세고 sort로 많이 나온 순으로 출력한 뒤 result_ips.txt로 저장하라.
  4. score_data.txt를 숫자 기준으로 큰 값부터 정렬해 result_scores.txt로 저장하라.
  5. 두 결과 파일의 줄 수를 wc로 각각 확인하라.