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.txtless - 페이지 단위 탐색 (권장)
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.c | abc, a1c, a-c |
* | 앞 문자 0회 이상 반복 | ab*c | ac, abc, abbc |
+ | 앞 문자 1회 이상 반복 (ERE) | ab+c | abc, abbc (ac는 X) |
? | 앞 문자 0 또는 1회 (ERE) | colou?r | color, colour |
^ | 줄의 시작 | ^Hello | Hello로 시작하는 줄 |
$ | 줄의 끝 | world$ | world로 끝나는 줄 |
[] | 문자 클래스 (하나 매칭) | [aeiou] | 모음 하나 |
[^] | 부정 문자 클래스 | [^0-9] | 숫자가 아닌 문자 |
() | 그룹화 (ERE) | (ab)+ | ab, abab |
| | OR (ERE) | cat|dog | cat 또는 dog |
\b | 단어 경계 | \bword\b | word (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.py4. 스트림 편집: 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.txt5. 텍스트 분석: 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 | headprintf 포맷 출력
# 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.csv6. 정렬/중복: 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.csvuniq - 중복 처리
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 -10tee - 출력을 화면과 파일에 동시에
# 화면에 출력하면서 파일에도 저장
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/passwdpaste - 파일 줄을 병렬 결합
# 두 파일을 나란히 합치기
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 # gz8. 비교: 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 # 사용자 계정 수