1. 파일 내용 확인

cat - 파일 내용 출력

cat file.txt                     # 파일 전체 출력
cat file1.txt file2.txt          # 여러 파일 연결 출력
cat -n file.txt                  # 줄 번호 표시
cat -b file.txt                  # 비어있지 않은 줄만 번호 표시
cat -s file.txt                  # 연속된 빈 줄을 하나로 축소
cat -A file.txt                  # 특수문자 표시 (탭: ^I, 줄끝: $)
cat -e file.txt                  # 줄 끝에 $ 표시
 
# 파일 생성 (히어독)
cat > newfile.txt << 'EOF'
line 1
line 2
EOF
 
# 파일 연결
cat header.txt body.txt footer.txt > full.txt
 
# 파일 추가 (append)
cat extra.txt >> existing.txt

less - 페이지 단위 탐색 (권장)

more보다 기능이 풍부하며, 역방향 스크롤이 가능하다. 대용량 파일에 적합 (전체를 메모리에 로드하지 않음).

less file.txt
 
# less 내부 명령:
# Space / f       다음 페이지
# b               이전 페이지
# Enter / j       다음 줄
# k               이전 줄
# g               파일 처음으로
# G               파일 끝으로
# /pattern        앞으로 검색
# ?pattern        뒤로 검색
# n               다음 검색 결과
# N               이전 검색 결과
# q               종료
# -N              줄 번호 토글
# F               tail -f 모드 (실시간 모니터링, Ctrl+C로 복귀)
# v               vi 에디터로 전환

more - 페이지 단위 출력

less보다 기능이 제한적. 앞으로만 스크롤 가능.

more file.txt
 
# Space: 다음 페이지, Enter: 다음 줄, q: 종료

head - 파일 앞부분 출력

head file.txt                    # 처음 10줄 (기본값)
head -n 20 file.txt              # 처음 20줄
head -20 file.txt                # 위와 동일 (축약)
head -c 100 file.txt             # 처음 100바이트
head -n -5 file.txt              # 마지막 5줄 제외한 나머지
 
# 여러 파일
head file1.txt file2.txt         # 각 파일명 헤더와 함께 출력

tail - 파일 뒷부분 출력

tail file.txt                    # 마지막 10줄 (기본값)
tail -n 20 file.txt              # 마지막 20줄
tail -20 file.txt                # 위와 동일
tail -c 100 file.txt             # 마지막 100바이트
tail -n +5 file.txt              # 5번째 줄부터 끝까지
 
# 실시간 모니터링 (-f: follow)
tail -f /var/log/syslog          # 로그 실시간 추적 (새 줄 추가되면 출력)
tail -f -n 50 /var/log/syslog    # 마지막 50줄 + 실시간 추적
tail -F /var/log/syslog          # 파일이 로테이션(재생성)되어도 추적 지속
 
# 여러 파일 실시간 모니터링
tail -f /var/log/syslog /var/log/auth.log
 
# Ctrl+C로 종료

2. 검색/필터: grep

기본 사용법

grep "pattern" file.txt              # 패턴이 포함된 줄 출력
grep "pattern" file1.txt file2.txt   # 여러 파일에서 검색
grep "pattern" *.txt                 # 와일드카드로 여러 파일

주요 옵션

옵션설명예시
-i대소문자 무시grep -i "error" log.txt
-n줄 번호 표시grep -n "TODO" code.py
-v패턴 불일치 줄 출력 (반전)grep -v "^#" config.conf (주석 제외)
-r / -R디렉토리 재귀 검색grep -r "import" src/
-l매칭된 파일명만 출력grep -rl "TODO" src/
-L매칭되지 않는 파일명만 출력grep -rL "license" src/
-c매칭 줄 수만 출력grep -c "error" log.txt
-w단어 단위 매칭grep -w "the" file.txt (other 제외)
-x줄 전체가 매칭grep -x "exact line" file.txt
-E확장 정규표현식 (ERE)`grep -E “error
-F정규표현식 비활성 (리터럴)grep -F "a.b" file.txt (a.b 그대로)
-o매칭 부분만 출력grep -oE '[0-9]+' file.txt
-A N매칭 줄 이후 N줄 포함grep -A 3 "error" log.txt
-B N매칭 줄 이전 N줄 포함grep -B 2 "error" log.txt
-C N매칭 줄 전후 N줄 포함grep -C 5 "error" log.txt
--include특정 파일만 검색grep -r --include="*.py" "pattern" .
--exclude특정 파일 제외grep -r --exclude="*.log" "pattern" .
--exclude-dir특정 디렉토리 제외grep -r --exclude-dir=".git" "pattern" .

egrep, fgrep

# egrep = grep -E (확장 정규표현식)
egrep "error|warning|critical" log.txt
 
# fgrep = grep -F (고정 문자열, 정규표현식 비활성)
fgrep "*.txt" file.txt       # *가 리터럴로 처리됨

실전 활용

# 로그에서 에러 검색 (전후 문맥 포함)
grep -inC 3 "error" /var/log/syslog
 
# 코드에서 TODO/FIXME 찾기
grep -rnE "TODO|FIXME|HACK" src/ --include="*.py"
 
# IP 주소 추출
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log
 
# 빈 줄 제거
grep -v '^$' file.txt
 
# 주석과 빈 줄 제외한 설정 파일
grep -vE '^\s*(#|$)' /etc/ssh/sshd_config
 
# 특정 프로세스 검색 (자기 자신 제외)
ps aux | grep "[n]ginx"      # [n]ginx 트릭으로 grep 자신 제외
 
# 파일에서 특정 패턴이 포함된 줄 수
grep -c "pattern" file.txt
 
# 파이프와 함께
dmesg | grep -i "usb"
history | grep "git"

3. 정규표현식 기초

BRE (Basic Regular Expression) vs ERE (Extended Regular Expression)

메타문자BRE (grep)ERE (grep -E / egrep)
?\??
+\++
{n,m}\{n,m\}{n,m}
()\(\)()
||`
., *, ^, $, []동일동일

결론: ERE(grep -E)가 이스케이프가 적어 편리하므로, 복잡한 패턴에서는 grep -E를 권장.

주요 메타문자

메타문자의미예시매칭
.아무 문자 1개a.cabc, a1c, a-c
*앞 문자 0회 이상 반복ab*cac, abc, abbc
+앞 문자 1회 이상 반복 (ERE)ab+cabc, abbc (ac는 X)
?앞 문자 0 또는 1회 (ERE)colou?rcolor, colour
^줄의 시작^HelloHello로 시작하는 줄
$줄의 끝world$world로 끝나는 줄
[]문자 클래스 (하나 매칭)[aeiou]모음 하나
[^]부정 문자 클래스[^0-9]숫자가 아닌 문자
()그룹화 (ERE)(ab)+ab, abab
|OR (ERE)cat|dogcat 또는 dog
\b단어 경계\bword\bword (keyword 제외)
{n}정확히 n회 반복 (ERE)a{3}aaa
{n,m}n회~m회 반복 (ERE)a{2,4}aa, aaa, aaaa
{n,}n회 이상 반복 (ERE)a{2,}aa, aaa, aaaa, …

POSIX 문자 클래스

클래스의미동등 표현
[:alpha:]알파벳[a-zA-Z]
[:digit:]숫자[0-9]
[:alnum:]알파벳+숫자[a-zA-Z0-9]
[:space:]공백 문자[\t\n\r\f\v ]
[:upper:]대문자[A-Z]
[:lower:]소문자[a-z]
[:blank:]스페이스/탭[ \t]
# 사용법: 이중 대괄호 필요
grep '[[:digit:]]' file.txt         # 숫자 포함 줄
grep '[[:upper:]]' file.txt         # 대문자 포함 줄

정규표현식 실전 예시

# 이메일 주소 패턴 (간단한 버전)
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file.txt
 
# IP 주소 패턴
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' file.txt
 
# 전화번호 패턴 (한국)
grep -E '0[0-9]{1,2}-[0-9]{3,4}-[0-9]{4}' file.txt
 
# 날짜 패턴 (YYYY-MM-DD)
grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' file.txt
 
# 빈 줄
grep '^$' file.txt
 
# 공백만 있는 줄 포함
grep -E '^\s*$' file.txt
 
# 주석 줄 (#으로 시작)
grep '^#' file.txt
grep -E '^\s*#' file.txt            # 앞에 공백이 있을 수도
 
# 특정 단어로 시작하는 줄
grep -E '^(import|from)' script.py

4. 스트림 편집: sed

sed (Stream Editor)는 텍스트를 줄 단위로 처리하는 비대화식 편집기. 파이프라인에서 텍스트 변환에 강력하다.

기본 문법

sed [옵션] '명령' 파일
sed [옵션] -e '명령1' -e '명령2' 파일
sed [옵션] -f script.sed 파일

치환 (s - substitute)

# 기본 치환: 각 줄의 첫 번째 매칭만
sed 's/old/new/' file.txt
 
# 전역 치환: 줄의 모든 매칭 (g 플래그)
sed 's/old/new/g' file.txt
 
# 대소문자 무시 (I 플래그, GNU sed)
sed 's/error/ERROR/gI' file.txt
 
# N번째 매칭만 치환
sed 's/old/new/2' file.txt           # 각 줄의 2번째 매칭만
 
# 인라인 편집 (원본 파일 직접 수정)
sed -i 's/old/new/g' file.txt
 
# 인라인 편집 + 백업
sed -i.bak 's/old/new/g' file.txt    # 원본을 file.txt.bak으로 보존
 
# 구분자 변경 (경로 등 /가 포함된 문자열)
sed 's|/usr/local|/opt|g' file.txt
sed 's#/old/path#/new/path#g' file.txt
 
# 특정 줄에만 적용
sed '3s/old/new/' file.txt           # 3번째 줄만
sed '1,5s/old/new/g' file.txt        # 1~5번째 줄
sed '/pattern/s/old/new/g' file.txt  # pattern이 있는 줄만
 
# 역참조 (캡처 그룹)
sed 's/\(Hello\) \(World\)/\2 \1/' file.txt   # World Hello
sed -E 's/(Hello) (World)/\2 \1/' file.txt     # ERE 모드
 
# 매칭 전체 참조 (&)
sed 's/[0-9]*/[&]/' file.txt         # 숫자를 []로 감싸기

삭제 (d)

sed '3d' file.txt                    # 3번째 줄 삭제
sed '1,5d' file.txt                  # 1~5번째 줄 삭제
sed '$d' file.txt                    # 마지막 줄 삭제
sed '/pattern/d' file.txt            # 패턴 매칭 줄 삭제
sed '/^$/d' file.txt                 # 빈 줄 삭제
sed '/^#/d' file.txt                 # 주석 줄 삭제
sed '/^#/d; /^$/d' file.txt          # 주석 + 빈 줄 삭제

삽입/추가 (i, a)

# 특정 줄 앞에 삽입 (i)
sed '3i\New line before line 3' file.txt
 
# 특정 줄 뒤에 추가 (a)
sed '3a\New line after line 3' file.txt
 
# 패턴 매칭 줄 뒤에 추가
sed '/pattern/a\Added after pattern' file.txt
 
# 첫 줄에 삽입
sed '1i\Header line' file.txt
 
# 마지막 줄 뒤에 추가
sed '$a\Footer line' file.txt

출력 제어 (p, -n)

# 패턴 매칭 줄만 출력 (-n + p)
sed -n '/error/p' file.txt           # grep과 유사
 
# 특정 범위만 출력
sed -n '10,20p' file.txt             # 10~20번째 줄
 
# 두 패턴 사이 출력
sed -n '/START/,/END/p' file.txt

실전 활용

# 줄 앞/뒤 공백 제거 (trim)
sed 's/^[[:space:]]*//; s/[[:space:]]*$//' file.txt
 
# 연속 공백을 하나로
sed 's/  */ /g' file.txt
 
# Windows 줄 끝(CRLF)을 Unix(LF)로 변환
sed 's/\r$//' file.txt
 
# HTML 태그 제거 (간단한 버전)
sed 's/<[^>]*>//g' file.html
 
# 설정 파일 값 변경
sed -i 's/^Port .*/Port 2222/' /etc/ssh/sshd_config
 
# 여러 치환 조합
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file.txt

5. 텍스트 분석: awk

awk는 텍스트를 필드(열) 단위로 처리하는 프로그래밍 언어. 구조화된 데이터(CSV, TSV, 로그 등)를 분석하는 데 강력하다.

기본 구조

awk 'pattern { action }' file
awk -F'구분자' 'pattern { action }' file
  • pattern: 조건 (생략하면 모든 줄)
  • action: 실행할 동작 (생략하면 print)
  • $0: 전체 줄, $1: 첫 번째 필드, $2: 두 번째 필드, …

필드 분리

# 기본 구분자: 공백/탭
awk '{print $1}' file.txt            # 첫 번째 필드
awk '{print $1, $3}' file.txt        # 1번째, 3번째 필드 (공백으로 연결)
awk '{print $NF}' file.txt           # 마지막 필드
 
# 구분자 지정 (-F)
awk -F: '{print $1, $7}' /etc/passwd          # : 구분, 사용자명과 셸
awk -F, '{print $2}' data.csv                 # 쉼표 구분
awk -F'\t' '{print $1}' data.tsv              # 탭 구분
 
# 여러 구분자
awk -F'[,;:]' '{print $1}' file.txt

패턴 매칭

# 정규표현식 매칭
awk '/error/' log.txt                         # error 포함 줄 출력
awk '!/comment/' file.txt                     # comment 미포함 줄
awk '/^[0-9]/' file.txt                       # 숫자로 시작하는 줄
 
# 필드 비교
awk '$3 > 100' data.txt                       # 3번째 필드가 100 초과
awk '$1 == "admin"' /etc/passwd               # 1번째 필드가 "admin"
awk -F: '$3 >= 1000' /etc/passwd              # UID >= 1000 (일반 사용자)
awk '$NF ~ /error/' log.txt                   # 마지막 필드에 error 포함 (~: 매칭)
awk '$NF !~ /^#/' file.txt                    # 마지막 필드가 #으로 시작하지 않음

BEGIN/END 블록

# BEGIN: 입력 처리 전 실행, END: 입력 처리 후 실행
awk 'BEGIN {print "=== Start ==="} {print $0} END {print "=== End ==="}' file.txt
 
# 합계 계산
awk '{sum += $1} END {print "Total:", sum}' numbers.txt
 
# 평균 계산
awk '{sum += $1; count++} END {print "Average:", sum/count}' numbers.txt
 
# BEGIN에서 구분자 설정
awk 'BEGIN {FS=":"; OFS="\t"} {print $1, $7}' /etc/passwd

내장 변수

변수설명
NR현재 줄 번호 (Number of Record)
NF현재 줄의 필드 수 (Number of Fields)
FS입력 필드 구분자 (Field Separator, 기본: 공백)
OFS출력 필드 구분자 (Output Field Separator, 기본: 공백)
RS입력 레코드 구분자 (Record Separator, 기본: 개행)
ORS출력 레코드 구분자 (Output Record Separator, 기본: 개행)
FILENAME현재 처리 중인 파일명
FNR현재 파일 내 줄 번호 (파일 여러 개일 때 각각 리셋)
# 줄 번호 출력
awk '{print NR, $0}' file.txt
 
# 각 줄의 필드 수
awk '{print NR": "$0" -> "NF" fields"}' file.txt
 
# 특정 줄만
awk 'NR >= 10 && NR <= 20' file.txt            # 10~20줄
 
# 출력 구분자 변경
awk -F: 'BEGIN {OFS=","} {print $1, $3, $7}' /etc/passwd

조건문/반복문

# if-else
awk '{if ($3 > 100) print $1, "HIGH"; else print $1, "LOW"}' data.txt
 
# for 루프
awk '{for (i=1; i<=NF; i++) print $i}' file.txt     # 각 필드를 줄 단위로
 
# 배열 (연관 배열 / 해시맵)
# 단어 빈도 세기
awk '{for (i=1; i<=NF; i++) count[$i]++} END {for (w in count) print count[w], w}' file.txt | sort -rn
 
# 로그에서 IP별 접속 횟수
awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log | sort -rn | head

printf 포맷 출력

# C 스타일 printf
awk '{printf "%-20s %10d\n", $1, $3}' data.txt
 
# 형식 지정자: %s(문자열), %d(정수), %f(실수), %e(지수)
# 정렬: -(왼쪽), 숫자(너비), .숫자(정밀도)
awk -F: '{printf "User: %-15s UID: %5d Shell: %s\n", $1, $3, $7}' /etc/passwd

실전 활용

# CSV 특정 열 합계
awk -F, '{sum += $3} END {printf "Total: %.2f\n", sum}' sales.csv
 
# 디스크 사용량 요약
df -h | awk 'NR>1 {print $5, $6}'               # 사용률과 마운트포인트
 
# 프로세스 메모리 사용량 상위
ps aux | awk 'NR>1 {print $4, $11}' | sort -rn | head -10
 
# 로그에서 시간대별 요청 수
awk -F'[/ :]' '{print $7":"$8}' access.log | sort | uniq -c | sort -rn
 
# 특정 패턴 사이의 내용 추출
awk '/START/,/END/' file.txt
 
# 중복 줄 제거 (순서 유지, uniq와 달리 정렬 불필요)
awk '!seen[$0]++' file.txt
 
# 필드 값 기준 그룹핑
awk -F, '{group[$1] += $2} END {for (k in group) print k, group[k]}' data.csv

6. 정렬/중복: sort, uniq, tee

sort - 정렬

sort file.txt                        # 알파벳순 정렬
sort -n file.txt                     # 숫자순 정렬
sort -r file.txt                     # 역순 정렬
sort -rn file.txt                    # 숫자 역순 (큰 수부터)
 
# 특정 필드 기준 정렬
sort -k 2 file.txt                   # 2번째 필드 기준
sort -k 2n file.txt                  # 2번째 필드, 숫자순
sort -k 2,2 file.txt                 # 정확히 2번째 필드만
sort -k 1,1 -k 2,2n file.txt        # 1번째 필드 문자순, 2번째 필드 숫자순
 
# 구분자 지정
sort -t: -k 3 -n /etc/passwd        # ':'로 구분, 3번째 필드(UID) 숫자순
 
# 중복 제거
sort -u file.txt                     # 정렬 + 중복 제거
 
# 안정 정렬 (동일 키에서 원래 순서 유지)
sort -s -k 1 file.txt
 
# 사람이 읽기 좋은 숫자 정렬 (K, M, G 단위)
du -sh * | sort -h                   # -h: human-numeric-sort
sort -h file.txt
 
# 랜덤 정렬 (셔플)
sort -R file.txt
 
# 실전 예시
# 디스크 사용량 내림차순
du -sh /var/* | sort -rh
 
# CSV 정렬
sort -t, -k 3 -n data.csv

uniq - 중복 처리

sort와 함께 사용. 연속된 중복 줄만 처리하므로, 비연속 중복 제거 시 반드시 sort 먼저 수행.

sort file.txt | uniq                 # 중복 제거
sort file.txt | uniq -c              # 각 줄의 출현 횟수 표시
sort file.txt | uniq -d              # 중복된 줄만 출력
sort file.txt | uniq -u              # 유일한 줄만 출력 (중복 아닌 것)
sort file.txt | uniq -ci             # 대소문자 무시하여 카운트
 
# 실전: 가장 많이 등장하는 항목 Top 10
sort file.txt | uniq -c | sort -rn | head -10
 
# 로그에서 가장 많은 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

tee - 출력을 화면과 파일에 동시에

# 화면에 출력하면서 파일에도 저장
command | tee output.txt
 
# 기존 파일에 추가 (append)
command | tee -a output.txt
 
# 여러 파일에 동시 저장
command | tee file1.txt file2.txt
 
# 중간 파이프라인 확인
cat data.txt | sort | tee sorted.txt | uniq -c | sort -rn
#                      ^^^^^^^^^^^^^^ 정렬 결과를 중간에 저장
 
# sudo와 함께 (리다이렉션 권한 문제 해결)
echo "new line" | sudo tee -a /etc/some_config
# 'sudo echo "..." > /etc/...'는 동작하지 않음 (리다이렉션은 현재 셸이 수행)

7. 텍스트 변환: cut, paste, tr, rev

cut - 필드/문자 추출

# 구분자와 필드 번호로 추출
cut -d: -f1 /etc/passwd              # ':'로 구분, 1번째 필드 (사용자명)
cut -d: -f1,7 /etc/passwd            # 1, 7번째 필드
cut -d: -f1-3 /etc/passwd            # 1~3번째 필드
cut -d, -f2 data.csv                 # CSV에서 2번째 열
 
# 문자 위치로 추출
cut -c1-5 file.txt                   # 각 줄의 1~5번째 문자
cut -c5- file.txt                    # 5번째 문자부터 끝까지
cut -c-10 file.txt                   # 처음부터 10번째까지
 
# 바이트 위치
cut -b1-10 file.txt                  # 1~10번째 바이트
 
# 출력 구분자 지정
cut -d: -f1,7 --output-delimiter=',' /etc/passwd

paste - 파일 줄을 병렬 결합

# 두 파일을 나란히 합치기
paste file1.txt file2.txt            # 탭으로 구분
paste -d, file1.txt file2.txt        # 쉼표로 구분
 
# 한 파일의 줄을 나란히
paste -s file.txt                    # 모든 줄을 한 줄로 (탭 구분)
paste -sd, file.txt                  # 모든 줄을 쉼표로 한 줄로
 
# N줄씩 묶기
paste - - < file.txt                 # 2줄씩 (탭으로 합쳐서)
paste -d, - - - < file.txt           # 3줄씩 (쉼표로 합쳐서)

tr - 문자 변환/삭제

# 문자 치환
echo "hello" | tr 'a-z' 'A-Z'       # 소문자 -> 대문자
echo "HELLO" | tr 'A-Z' 'a-z'       # 대문자 -> 소문자
echo "hello" | tr 'el' 'ip'         # e->i, l->p: hippo
 
# 문자 삭제 (-d)
echo "hello 123" | tr -d '0-9'      # 숫자 삭제: "hello "
echo "hello world" | tr -d ' '      # 공백 삭제: "helloworld"
 
# 문자 압축 (-s: squeeze)
echo "heeello" | tr -s 'e'          # 연속 'e'를 하나로: "hello"
echo "a  b   c" | tr -s ' '         # 연속 공백을 하나로: "a b c"
 
# 보수 (-c: complement, 지정 문자 외)
echo "abc123def" | tr -cd '0-9'     # 숫자만 남기기: "123"
echo "abc123def" | tr -cd 'a-z\n'   # 소문자와 개행만 남기기
 
# 줄바꿈 변환
tr '\n' ',' < file.txt               # 줄바꿈을 쉼표로
tr ',' '\n' < file.txt               # 쉼표를 줄바꿈으로
 
# POSIX 문자 클래스
echo "Hello123" | tr '[:upper:]' '[:lower:]'

rev - 문자열 뒤집기

echo "hello" | rev               # olleh
rev file.txt                     # 각 줄의 문자열 반전
 
# 확장자 추출에 활용
echo "file.tar.gz" | rev | cut -d. -f1 | rev    # gz

8. 비교: diff, comm, patch

diff - 파일 차이 비교

diff file1.txt file2.txt             # 기본 형식
diff -u file1.txt file2.txt          # 통합(unified) 형식 - 가장 많이 사용
diff -y file1.txt file2.txt          # 나란히(side-by-side) 비교
diff -c file1.txt file2.txt          # 컨텍스트 형식
diff -q file1.txt file2.txt          # 다른지만 확인 (내용 출력 X)
diff -r dir1/ dir2/                  # 디렉토리 재귀 비교
diff --color file1.txt file2.txt     # 색상 표시
 
# unified diff 읽기
# --- file1.txt   (원본)
# +++ file2.txt   (변경)
# @@ -1,3 +1,4 @@ (위치 정보)
#  context line   (변경 없는 줄)
# -removed line   (삭제된 줄)
# +added line     (추가된 줄)

comm - 정렬된 파일 비교

두 파일이 이미 정렬되어 있어야 한다. 3열 출력: 1열(file1에만), 2열(file2에만), 3열(공통).

comm file1_sorted.txt file2_sorted.txt
 
# 특정 열 숨기기
comm -12 file1.txt file2.txt         # 공통 줄만 출력 (1,2열 숨김)
comm -23 file1.txt file2.txt         # file1에만 있는 줄 (2,3열 숨김)
comm -13 file1.txt file2.txt         # file2에만 있는 줄 (1,3열 숨김)
 
# 정렬 후 사용
comm <(sort file1.txt) <(sort file2.txt)

patch - diff 결과로 파일 패치

# 패치 파일 생성
diff -u original.txt modified.txt > changes.patch
 
# 패치 적용
patch original.txt < changes.patch
 
# 패치 되돌리기 (역적용)
patch -R original.txt < changes.patch
 
# 디렉토리 패치
diff -ru dir_original/ dir_modified/ > dir.patch
cd dir_original/
patch -p1 < ../dir.patch
 
# -p: 경로에서 제거할 슬래시 수 (패치 파일의 경로와 실제 경로 맞춤)

9. wc - 줄/단어/문자 수 카운트

wc file.txt                      # 줄  단어  바이트  파일명
#  100  450  3200  file.txt
 
wc -l file.txt                   # 줄 수만
wc -w file.txt                   # 단어 수만
wc -c file.txt                   # 바이트 수만
wc -m file.txt                   # 문자 수 (멀티바이트 문자 고려)
wc -L file.txt                   # 가장 긴 줄의 길이
 
# 여러 파일
wc -l *.py                       # 각 파일 줄 수 + 합계
 
# 파이프와 함께
find . -name "*.py" | wc -l      # .py 파일 개수
ps aux | wc -l                   # 프로세스 수 (헤더 포함)
cat /etc/passwd | wc -l          # 사용자 계정 수