κ°œλ°œλ…ΈνŠΈ/Linux

[Linux] λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리의 핡심, awk와 sed 싀무 κ°€μ΄λ“œ πŸ“‘

둜둜뽜 2025. 11. 22. 07:30

λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리 awk sed ν™œμš©λ²•μ„ ν•œ λ²ˆμ— μ •λ¦¬ν•œ 싀무 κ°€μ΄λ“œ. 둜그 뢄석, μ„€μ • 파일 μžλ™ μΉ˜ν™˜, CSV 집계 λ“± 개발·μš΄μ˜ ν™˜κ²½μ—μ„œ λ°”λ‘œ μ μš©ν•  수 μžˆλŠ” 핡심 νŒ¨ν„΄μ„ 예제둜 μ„€λͺ…ν•©λ‹ˆλ‹€.

1. λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리의 핡심, awk와 sedλ₯Ό 싀무 관점

λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리 도ꡬ μ—­ν•  비ꡐ / title: grep·sed·awk κΈ°λŠ₯ 비ꡐ
grep/sed/awk κΈ°λŠ₯ 비ꡐ

λ¦¬λˆ…μŠ€μ—μ„œ μ‹œμŠ€ν…œμ„ κ°œλ°œν•˜κ±°λ‚˜ μ„œλ²„λ₯Ό μš΄μ˜ν•˜λŠ” μ‚¬λžŒμ΄λΌλ©΄ ν…μŠ€νŠΈ νŒŒμΌμ„ λ‹€λ£¨λŠ” 일은 ν”Όν•  수 μ—†λ‹€.
특히 둜그 뢄석, μ„€μ • 파일 μžλ™ν™”, CSV 데이터 가곡 같은 μž‘μ—…μ€ 맀일 λ°˜λ³΅λ˜λŠ” 업무에 가깝닀.

ν•˜μ§€λ§Œ λ¬Έμ œλŠ” 이렇닀.

  • 맀번 ν…μŠ€νŠΈ μ—λ””ν„°λ‘œ μ—΄μ–΄μ„œ νŽΈμ§‘ν•˜λ©΄ λŠλ¦¬λ‹€.
  • λ³΅μž‘ν•œ λ‘œκ·ΈλŠ” νŒ¨ν„΄μ΄ λˆˆμ— 잘 μ•ˆ λ“€μ–΄μ˜¨λ‹€.
  • 반볡 μž‘μ—…μ€ μ‹€μˆ˜ μœ„ν—˜μ΄ λ†’λ‹€.

κ·Έλž˜μ„œ ν˜„μ—… μ—”μ§€λ‹ˆμ–΄λ“€μ΄ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” 도ꡬ가 λ°”λ‘œ awk / sedλ‹€.
이 두 λ„κ΅¬λŠ” λ‹¨μˆœν•œ λ¬Έμžμ—΄ μΉ˜ν™˜μ„ λ„˜μ–΄μ„œ 쑰건 필터링, 숫자 계산, 집계, 데이터 ν¬λ§·νŒ…, μžλ™ν™” 슀크립트 μž‘μ„±κΉŒμ§€ λͺ¨λ‘ μ»€λ²„ν•œλ‹€.

λ”°λΌμ„œ 이 κΈ€μ—μ„œλŠ” λ‹€μŒ μˆœμ„œλ‘œ μ‹€λ¬΄μ—μ„œ λ°”λ‘œ μ“°λŠ” λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리 awk sed κΈ°μˆ μ„ μ •λ¦¬ν•œλ‹€:

  1. grep / sed / awk μ—­ν•  뢄리
  2. sed κΈ°λ³Έ → ν™•μž₯ νŒ¨ν„΄
  3. awk κΈ°λ³Έ → 싀무 집계 사둀
  4. 둜그·CSV·μ„€μ • μžλ™ν™” νŒ¨ν„΄ 정리
  5. μ‹€λ¬΄μžκ°€ κ°€μž₯ 많이 μ“°λŠ” μ‘°ν•© νŒ¨ν„΄
  6. FAQ + κ΄€λ ¨ ν‚€μ›Œλ“œ

이 ꡬ쑰만 μ•Œκ³  μžˆμ–΄λ„ λŒ€λΆ€λΆ„μ˜ 둜그 처리 μž‘μ—…μ„ μ›λΌμ΄λ„ˆ μˆ˜μ€€μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλ‹€.


2. grep / sed / awk μ—­ν•  ν•œ λ²ˆμ— κ΅¬λΆ„ν•˜κΈ°

ν…μŠ€νŠΈ 처리 νŒŒμ΄ν”„λΌμΈ ꡬ성 / title: grep → sed → awk 처리 흐름도
grep → sed → awk 데이터 처리 흐름도

λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리의 기본은 grep → sed → awk μ„Έ 도ꡬλ₯Ό μ •ν™•νžˆ κ΅¬λΆ„ν•˜λŠ” 것이닀.

μ„Έ λ„κ΅¬λŠ” λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ 역할이 λͺ…ν™•νžˆ λ‹€λ¦…λ‹ˆλ‹€.

βœ” grep: ν•„μš”ν•œ 쀄을 μ°ΎλŠ”λ‹€ (ν•„ν„°)

grep "ERROR" app.log
  • νŠΉμ • νŒ¨ν„΄μ„ ν¬ν•¨ν•œ μ€„λ§Œ μ°ΎλŠ”λ‹€
  • 즉, “라인 선택” λ‹΄λ‹Ή

βœ” sed: μ€„μ˜ λ‚΄μš©μ„ λ°”κΎΌλ‹€ (μΉ˜ν™˜/μ‚­μ œ/μ‚½μž…)

sed -i 's/debug=1/debug=0/' app.conf
  • νŠΉμ • λ¬Έμžμ—΄μ„ κ΅μ²΄ν•˜κ±°λ‚˜ μ‚­μ œ
  • μ„€μ • 파일 μžλ™ λ³€ν™˜
  • “라인 νŽΈμ§‘” λ‹΄λ‹Ή

βœ” awk: 각 쀄을 ν•„λ“œ λ‹¨μœ„λ‘œ 계산/집계

awk '{ cnt[$1]++ } END { for(ip in cnt) print ip, cnt[ip] }'
  • 곡백/콀마/νƒ­μœΌλ‘œ κ΅¬λΆ„λœ ν…μŠ€νŠΈλ₯Ό ν•„λ“œ λ‹¨μœ„λ‘œ 뢄석
  • 합계, 평균, κ·Έλ£Ή 집계 λ“± 숫자 계산
  • “데이터 뢄석” λ‹΄λ‹Ή

🎯 ν•œ 쀄 μš”μ•½

쀄을 κ³ λ₯Ό λ•Œ → grep  
쀄 λ‚΄μš©μ„ λ°”κΏ€ λ•Œ → sed  
쀄 μ•ˆμ˜ 데이터λ₯Ό 계산할 λ•Œ → awk
 

이 쑰합이 λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리의 핡심이닀.


3. sed : ν…μŠ€νŠΈ 슀트림 νŽΈμ§‘κΈ°μ˜ 핡심 정리

sed λ‚΄λΆ€ ꡬ쑰 μ„€λͺ…: μž…λ ₯ 슀트림이 Pattern Spaceμ—μ„œ 처리되고 좜λ ₯ 슀트림으둜 μ „λ‹¬λ˜λŠ” 흐름도
Sed λ™μž‘ ꡬ쑰도

sedλŠ” μž…λ ₯ μŠ€νŠΈλ¦Όμ„ ν•œ μ€„μ”© Pattern Space에 μ μž¬ν•΄ λͺ…령을 μ μš©ν•˜κ³ , 
κ°€κ³΅λœ κ²°κ³Όλ₯Ό μΆœλ ₯ μŠ€νŠΈλ¦ΌμœΌλ‘œ λ³΄λ‚΄λŠ” κ΅¬μ‘°λ‘œ λ™μž‘ν•©λ‹ˆλ‹€.

κΈ°λ³Έ ν˜•νƒœ

sed 'λ™μž‘' 파일λͺ…
 

1) sed의 κ°€μž₯ κΈ°λ³Έ — μΉ˜ν™˜(s)

νŠΉμ • λ¬Έμžμ—΄ μΉ˜ν™˜

sed 's/old/new/' file.txt
 

ν•œ μ€„μ—μ„œ λͺ¨λ“  oldλ₯Ό λŒ€μ²΄

sed 's/old/new/g'
 

μ •κ·œμ‹ 적용

숫자둜 μ‹œμž‘ν•˜λŠ” λ¬Έμžμ—΄μ„ XXX둜 λ³€κ²½:

sed 's/^[0-9]\+/XXX/'
 

2) 원본 파일 직접 μˆ˜μ •ν•˜κΈ°(-i)

sed -i 's/debug=1/debug=0/' /etc/app.conf
 

λ°±μ—… νŒŒμΌμ„ 남기고 μ‹Άλ‹€λ©΄:

sed -i.bak 's/debug=1/debug=0/' /etc/app.conf
 

3) 쀄 μ‚­μ œ(d) — 번호/νŒ¨ν„΄ 기반

번호둜 μ‚­μ œ

sed '5d' file
sed '10,20d' file
 

νŒ¨ν„΄μœΌλ‘œ μ‚­μ œ

sed '/ERROR/d'
sed '/^#/d'
sed '/^$/d'
 

4) νŠΉμ • μ€„λ§Œ 좜λ ₯(p)

sed -n '5p'
sed -n '10,20p'
sed -n '/ERROR/p'
 

-n μ˜΅μ…˜μ€ “κΈ°λ³Έ 좜λ ₯ μ–΅μ œ” μ—­ν• .

5) 쀄 μ‚½μž…/μΆ”κ°€ (i, a)

라인 μœ„μ— μ‚½μž…:

sed '5i μƒˆ 쀄이 5번째 쀄 μœ„μ— μΆ”κ°€λ©λ‹ˆλ‹€.'
 

라인 μ•„λž˜ μ‚½μž…:

sed '5a μƒˆ 쀄이 5번째 쀄 μ•„λž˜μ— μΆ”κ°€λ©λ‹ˆλ‹€.'
 

νŠΉμ • νŒ¨ν„΄ μ•„λž˜ μ‚½μž…:

sed '/pattern/a ### μ€‘μš” μ„€μ • μ‹œμž‘ ###'
 

6) μ—¬λŸ¬ μΉ˜ν™˜μ„ λ™μ‹œμ— μ‹€ν–‰ν•˜κΈ°

sed -e 's/foo/bar/g' -e 's/on/off/g'
 

λ˜λŠ” 슀크립트 블둝:

sed '
s/foo/bar/g
s/on/off/g
'
 

7) 싀무 sed νŒ¨ν„΄ λͺ¨μŒ

주석 제거

sed '/^#/d'
 

빈 쀄 제거

sed '/^$/d'
 

μ•žλ’€ 곡백 제거

sed 's/^[ \t]*//;s/[ \t]*$//'
 

KEY=VALUEμ—μ„œ VALUE만 μΆ”μΆœ

echo "KEY=VALUE" | sed 's/^[^=]*=//'
 

4. awk λŠ” 둜그·CSV 뢄석에 μ’‹ 도ꡬ

awk ν•„λ“œ λ‹¨μœ„ 데이터 처리 ꡬ쑰 / title: awk ν•„λ“œ ꡬ쑰 μ„€λͺ…
awk ν•„λ“œ ꡬ쑰

awkλŠ” 쀄을 ν•„λ“œ λ‹¨μœ„λ‘œ λ‚˜λˆ„κ³  숫자 계산과 쑰건 ν•„ν„°λ§κΉŒμ§€ κ°€λŠ₯ν•œ μž‘μ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€.

κΈ°λ³Έ 문법

awk '{ λ™μž‘ }' 파일
 
  • $0 : 전체 쀄
  • $1 : 첫 번째 ν•„λ“œ
  • $NF : λ§ˆμ§€λ§‰ ν•„λ“œ
  • NR : ν˜„μž¬ 쀄 번호
  • NF : ν•„λ“œ 개수

κΈ°λ³Έ κ΅¬λΆ„μž: 곡백(슀페이슀/νƒ­)

1) ν•„λ“œ 좜λ ₯

awk '{ print $1, $3 }' file
 

CSVμ—μ„œ:

awk -F',' '{ print $1, $3 }'
 

2) 쑰건 필터링

3열이 30 이상인 μ€„λ§Œ:

awk '$3 >= 30'
 

ERROR ν¬ν•¨ν•œ μ€„λ§Œ:

awk '$0 ~ /ERROR/'
 

DEBUG 미포함:

awk '$0 !~ /DEBUG/'
 

3) 합계/평균 κ΅¬ν•˜κΈ° (END 블둝)

합계:

awk '{ sum += $2 } END { print sum }'
 

평균:

awk '{ sum += $2; cnt++ } END { print sum/cnt }'
 

4) NR/NF ν™œμš©

ν•„λ“œ 개수 좜λ ₯:

awk '{ print NF }'
 

헀더 κ±΄λ„ˆλ›°κΈ°:

awk 'NR>1'
 

5. 둜그·CSV 싀무 예제 λͺ¨μŒ

1) Nginx λ‘œκ·Έμ—μ„œ IP별 μš”μ²­ 수 집계

awk '{ cnt[$1]++ } END { for(ip in cnt) print cnt[ip], ip }' access.log | sort -nr | head
 

2) ps κ²°κ³Όμ—μ„œ CPU μ‚¬μš©λ₯  μƒμœ„ 5개

ps aux | awk '{ print $3, $11 }' | sort -nr | head -5
 

3) CSV νŠΉμ • 컬럼 합계

awk -F',' '{ sum += $3 } END { print sum }'
 

6. sed vs awk


ꡬ뢄 sed awk
μ—­ν•  λ¬Έμžμ—΄ μΉ˜ν™˜/μ‚­μ œ/μ‚½μž… ν•„λ“œ 기반 뢄석/계산/집계
κΈ°μ€€ μ •κ·œμ‹·λ¬Έμžμ—΄ 칼럼(ν•„λ“œ)
강점 μ„€μ •κ°’ λ³€κ²½, λ¬Έμžμ—΄ μˆ˜μ • λ‘œκ·Έμ§‘κ³„, 숫자 계산, CSV
λ‚œμ΄λ„ λ‹¨μˆœ 더 λ³΅μž‘ν•˜μ§€λ§Œ κ°•λ ₯

κ²°λ‘ 

  • ν…μŠ€νŠΈ 자체λ₯Ό λ°”κΎΈκ³  μ‹ΆμœΌλ©΄ sed
  • ν…μŠ€νŠΈ 데이터λ₯Ό λΆ„μ„ν•˜κ³  κ³„μ‚°ν•˜λ €λ©΄ awk

μ‹€λ¬΄μ—μ„œλŠ” 보톡:

grep → sed → awk
 

순으둜 νŒŒμ΄ν”„λ₯Ό μ‘°ν•©ν•œλ‹€.


7. κ°€μž₯ 많이 μ“°λŠ” 싀무 μ‘°ν•©

1) ERROR λ‘œκ·Έμ—μ„œ μ—λŸ¬ μ½”λ“œλ³„ 카운트

grep "ERROR" app.log \
| awk '{ cnt[$3]++ } END { for(c in cnt) print c, cnt[c] }'
 

2) μ„€μ • 파일의 νŠΉμ • μ˜΅μ…˜λ§Œ μ •ν™•νžˆ λ³€κ²½

sed -i 's/^enable_feature_x=.*/enable_feature_x=1/' app.conf
 

3) du κ²°κ³Ό μš©λŸ‰ 큰 순 μ •λ ¬

du -sh * | sort -hr
 

8. κΈ°λ³Έ νŒ¨ν„΄λ§Œ μ΅ν˜€λ„ μ‹€λ ₯ 70% μ™„μ„±

1) sed κΈ°λ³Έ νŒ¨ν„΄ 5개

sed 's/old/new/' file
sed 's/old/new/g' file
sed -i 's/old/new/g' file
sed '/^#/d'
sed '/^$/d'
 

2) awk κΈ°λ³Έ νŒ¨ν„΄ 5개

awk '{ print $1, $2 }'
awk -F',' '{ print $1, $3 }'
awk '$3 > 100'
awk '{ sum += $2 } END { print sum }'
awk '{ cnt[$1]++ } END { for(k in cnt) print k, cnt[k] }'
 

9. FAQ (자주 λ‚˜μ˜€λŠ” 질문)

Q. sed와 awk 쀑에 무엇을 λ¨Όμ € λ°°μ›Œμ•Ό ν•˜λ‚˜?

A. λ¬Έμžμ—΄ μΉ˜ν™˜μ΄ λ§Žλ‹€λ©΄ sed → κ·Έλ‹€μŒ awk μˆœμ„œκ°€ μ’‹λ‹€.

Q. 둜그 λΆ„μ„λ§Œ ν•œλ‹€λ©΄ awk만으둜 κ°€λŠ₯ν•œκ°€?

A. κ°€λŠ₯ν•˜μ§€λ§Œ grep/sed 쑰합이 훨씬 νš¨μœ¨μ μ΄λ‹€.

Q. Python으둜 ν•˜λ©΄ μ•ˆ λ˜λ‚˜?

A. κ°€λŠ₯ν•˜μ§€λ§Œ λ¦¬λˆ…μŠ€ μ„œλ²„μ—μ„  μ›λΌμ΄λ„ˆκ°€ 더 λΉ λ₯΄λ‹€.

Q. CSV 수백 MB도 awk둜 μ²˜λ¦¬λ˜λ‚˜?

A. λœλ‹€. 맀우 λΉ λ₯΄λ‹€.


10. λ¦¬λˆ…μŠ€ ν…μŠ€νŠΈ 처리 awk sedλŠ” μ–΄λ–€ 효과λ₯Ό μ£ΌλŠ”κ°€?

이 κΈ€μ˜ λ‚΄μš©μ„ μˆ™μ§€ν•˜λ©΄ λ‹€μŒ νš¨κ³Όκ°€ μžˆλ‹€:

  • 둜그 뢄석 속도가 λΉ„μ•½μ μœΌλ‘œ 빨라진닀
  • λ°˜λ³΅λ˜λŠ” μ„€μ • 파일 μˆ˜μ • μž‘μ—…μ„ μžλ™ν™”ν•  수 μžˆλ‹€
  • CSV κΈ°μ€€ 숫자 계산을 μ¦‰μ„μ—μ„œ μˆ˜ν–‰ν•  수 μžˆλ‹€
  • μ—‘μ…€ 없이도 원본 데이터λ₯Ό λΉ λ₯΄κ²Œ 정리할 수 μžˆλ‹€
  • DevOps / μ„œλ²„μš΄μ˜ / μž„λ² λ””λ“œ ν™˜κ²½μ—μ„œ ν•„μˆ˜ μŠ€ν‚¬ 확보
특히 κ°œλ°œμžμ™€ μš΄μ˜μžκ°€ ν•¨κ»˜ λ³΄λŠ” ν™˜κ²½μ—μ„œλŠ”
“awk/sed λ‹€λ£° 쀄 μ•„λŠ” μ‚¬λžŒ”이 μ—…무 속도 μžμ²΄κ°€ λ‹€λ₯΄λ‹€.