OS/Linux

๐Ÿง AWK ๋ช…๋ น์–ด ๋ฌธ๋ฒ• ๋งˆ์Šคํ„ฐ ๐Ÿ’ฏ ์ด์ •๋ฆฌ

์ธํŒŒ_ 2022. 3. 25. 13:04

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

AWK (Aho Weinberger Kernighan) ๊ฐœ๋…

AWK๋Š” ํ…์ŠคํŠธ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ด์ฃผ๊ฑฐ๋‚˜ ๊ธฐํƒ€ ๊ฐ€๊ณต์„ ํ†ตํ•ด์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ํ–‰๊ณผ ์—ด๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด๋‹ค. ์ข€๋” ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด, awk๋Š” "awk programming language"๋ผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ ํ•˜๋Š” ๋ช…๋ น์–ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์ข‹๋‹ค.

์ฆ‰, ๋ฆฌ๋ˆ…์Šค์—์„œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ(Shell Script)๋กœ ์ž‘์„ฑ๋œ ํŒŒ์ผ์ด ๋ฆฌ๋ˆ…์Šค ์‰˜(Shell)์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, awk๊ฐ€ "awk programming language" ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‹คํ–‰ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

๋ช…๋ น์–ด ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด a.txt ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ํŒŒ์ผ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1 2
3 4

๋งŒ์ผ 1์—ด์˜ ๋ฐ์ดํ„ฐ์™€ 2์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ๊ณฑํ•œ ๊ฐ’์„ ์–ป๋Š” ๋กœ์ง์„ ( 1*2=2 / 3*4=12 ) awk ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ awk๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด

$ cat a.txt | awk '{print $1 * $2;}'

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

์ด๋Ÿฐ์‹์œผ๋กœ ๋”ฐ๋กœ ์‰˜์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์—†์ด ๋‹จ ํ•œ์ค„๋กœ ์Šคํฌ๋ฆฝํŠธ ๋™์ž‘์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

awk๋Š” ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ ˆ์ฝ”๋“œ(record)๋ฅผ ์„ ํƒํ•˜๊ณ , ์„ ํƒ๋œ ๋ ˆ์ฝ”๋“œ์— ํฌํ•จ๋œ ๊ฐ’์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐํ™” ํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

์œ„์™€ ๊ฐ™์€ ํ…์ŠคํŠธ ํŒŒ์ผ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ ๊ฐ ๋‹จ์–ด๋“ค์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์ ธ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ๊ฐ ์ค„(line)์€ ๋ ˆ์ฝ”๋“œ(Record)๋ผ๊ณ  ์นญํ•˜๊ณ  ๊ทธ ์•ˆ์— ๊ฐ๊ฐ์˜ ๋‹จ์–ด๋“ค์ด ํ•„๋“œ(Field)๋ผ๊ณ  ์นญํ•ด์ง„๋‹ค. (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๊ณผ ๊ฐ™๋‹ค.)

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

 

AWK ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ๋ฒ•์—์„œ๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ $0, ๊ทธ๋ฆฌ๊ณ  $1, ..., $N์€ ๊ฐ ํ•„๋“œ ์ธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋˜์–ด ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ, ์œ„์—์„œ ์˜ˆ์‹œ๋ฅผ ๋“  ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด์ž๋ฉด, ์ด๋Ÿฐ์‹์œผ๋กœ ํ•ด์„์ด ๋œ๋‹ค.

$0๋Š” ํ•œ ํ–‰์„ ์˜๋ฏธํ•˜๊ณ , $1 ๋Š” ๊ทธ ํ–‰์˜ ์ฒซ๋ฒˆ์งธ ํ•„๋“œ, $2 ๋Š” ๋‘๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ
๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

 


๊ฐ„๋‹จํ•˜๊ฒŒ awk๊ฐ€ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, awk๋Š” ๋ช…๋ น์˜ ์ž…๋ ฅ์œผ๋กœ ์ง€์ •๋œ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•œ ๋‹ค์Œ, ๋ถ„๋ฅ˜๋œ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํŒจํ„ด ๋งค์นญ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๋ฐ ์—ฐ์‚ฐ ๋“ฑ์˜ ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งˆ์น˜ ๋ฆฌ๋ˆ…์Šค์˜ SQL๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

ํ–‰(๋ ˆ์ฝ”๋“œ)๊ณผ ์—ด(ํ•„๋“œ)๋กœ ์ด๋ฃจ์–ด์ง„ ํ…Œ์ด๋ธ” ํ˜•ํƒœ์˜ FROM ๋ฐ์ดํ„ฐ๋“ค ์ค‘์—์„œ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€ ์—ด(ํ•„๋“œ)๋งŒ SELECTํ•˜๊ณ  WHERE์ด๋‚˜ GROUP BY๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋“ค์„ ํ•ฉ์น˜๊ฑฐ๋‚˜ ์ผ๋ถ€๋งŒ ๋ฝ‘์•„ ๋‚ด์–ด ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด sql๋ฌธ์ธ๋ฐ, ์œ„์˜ awk ๊ณผ์ •์ด ๋ฐ”๋กœ ์ด๊ฒƒ๊ณผ ๋‹ค๋ฆ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฑฐ๊ธฐ๋‹ค SQL์˜ ์Šคํ† ์–ด๋“œ ํ”„๋กœ์‹œ์ €๋‚˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ awk์—ญ์‹œ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

awk ๋ช…๋ น์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋“ค์„ ๊ฐ„๋‹จํžˆ ๋‚˜์—ดํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ง€๊ธˆ์€ ์•„์ง ์„ธ์„ธํ•œ ๋ฌธ๋ฒ•์€ ๋ชจ๋ฅด์ง€๋งŒ ๋ˆˆ์— ์ตํ˜€๋‘์ž.

awk๋ฌธ๋ฒ•์ •๋ฆฌ


AWK ๋ช…๋ น์–ด ๋ฌธ๋ฒ•

$ awk [์˜ต์…˜] 'pattern { action }' [ํŒŒ์ผ|๋ณ€์ˆ˜๊ฐ’]
awk ์˜ต์…˜ ์„ค๋ช…
-u ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.
-F  ํ™•์žฅ๋œ ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ํ•„๋“œ๊ตฌ๋ถ„์ž๋ฅผ ์ง€์ •ํ•œ๋‹ค, ๋‹ค์ค‘ ํ•„๋“œ ๊ตฌ๋ถ„์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
awk -F ๋‹จ์ผ๋กœ ์‚ฌ์šฉ์‹œ ':' ๋ฅผ ํ•„๋“œ๊ตฌ๋ถ„์ž๋กœ ์‚ฌ์šฉ
awk -F'[ :\t]' ๋‹ค์ค‘ ํ•„๋“œ๊ตฌ๋ถ„์ž ':'์™€ tab์„ ํ•„๋“œ๊ตฌ๋ถ„์ž๋กœ ์‚ฌ์šฉ
-v ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ค€๋‹ค.
-f awk ๋ช…๋ น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜จ๋‹ค.

awk ๋™์ž‘ ์›๋ฆฌ

 

ํŒจํ„ด(pattern) ๊ณผ ์•ก์…˜(action)

  1. awk๋Š” ํŒŒ์ผ ๋˜๋Š” ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ ๋ผ์ธ์„ ์–ป์–ด์™€ $0๋ผ๋Š” ๋‚ด๋ถ€ ๋ณ€์ˆ˜์— ๋ผ์ธ์„ ์ž…๋ ฅํ•œ๋‹ค.
    ๊ฐ ๋ผ์ธ์€ ๋ ˆ์ฝ”๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , newline(๊ฐœํ–‰)์— ์˜ํ•ด ๊ตฌ๋ถ„๋˜๋‹ค.
    ์ด๋•Œ ํŒจํ„ด์ด ์—†์œผ๋ฉด ์ „์ฒด ๋ผ์ธ์„ ์–ป์–ด์˜ค๊ณ , ์›ํ•˜๋Š” ๋ผ์ธ๋งŒ ์–ป์–ด์˜ค๊ณ  ์‹ถ์„๋•Œ๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ๋ถ„๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. awk๋ฅผ ์‹คํ–‰ํ• ๋•Œ ๋‚ด์žฅ ๋ณ€์ˆ˜์ธ FS๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํ•„๋“œ ๋ถ„๋ฆฌ์ž๊ฐ€ ๊ณต๋ฐฑ์„ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค. (ํ•„๋“œ ๋ถ„๋ฆฌ ๊ธฐ์ค€์„ ๊ณต๋ฐฑ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€์ˆ˜๋„ ์žˆ๋‹ค)
    ๊ทธ๋Ÿฌ๋ฉด awk๋Š” ๋ผ์ธ์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ์˜ ํ•„๋“œ๋‚˜ ๋‹จ์–ด๋กœ ๋‚˜๋ˆˆ๋‹ค.
    ํ•„๋“œ๋Š” $1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋งŽ๊ฒŒ๋Š” $100 ์ด์ƒ์˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ฐ ํ•„๋“œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ–ˆ๋‹ค๋ฉด awk๋Š” ์•ก์…˜์„ ํ†ตํ•ด ๋™์ž‘ ์Šคํฌ๋ฆฝํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•„๋“œ๋“ค์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•  ๋•Œ print ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

# -F : ํ•„๋“œ ๊ตฌ๋ถ„ ๋ฌธ์ž๋ฅผ ๊ณต๋ฐฑ ๋ง๊ณ  ":" ๋กœ ์„ค์ •
# pattern /linux/ : linux ๋ฌธ์ž์—ด์„ ํฌํ•จํ•œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ
# action {print $1} : ๊ฐ ํ–‰(๋ ˆ์ฝ”๋“œ)์—์„œ ์ฒซ๋ฒˆ์งธ ํ•„๋“œ๋ฅผ ์ถœ๋ ฅ 
$ awk -F":" '/linux/ {print $1}' test.txxt
pattern ๊ณผ { action }์€ ๋ฐ˜๋“œ์‹œ ๋ช…๋ น์–ด์— ๋ชจ๋‘ ์จ์ค˜์•ผ ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด pattern์ด ์ƒ๋žต๋˜๋Š” ๊ฒฝ์šฐ,
๋งค์นญ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•  ๋ฌธ์ž์—ด ํŒจํ„ด ์ •๋ณด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์„ ํƒ๋˜๋Š” ๊ฑฐ๊ณ ,
# pattern ์ƒ๋žต.
$ awk '{ print }' ./file.txt      # file.txt์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ.
 
action์„ ์ƒ๋žตํ•˜๋ฉด, ๊ธฐ๋ณธ ์•ก์…˜์ธ print๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
# action ์ƒ๋žต.
$ awk '/p/' ./file.txt            # file.txt์—์„œ p๋ฅผ ํฌํ•จํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ.

 

awk ๋ช…๋ น์–ด๋Š” ๋‹จ์ผ๋กœ file์„ ์ฐธ์กฐํ•ด์„œ ์‹คํ–‰ํ•ด๋„ ๋˜๊ณ ,

๋‹ค๋ฅธ ๋ช…๋ น์–ด์™€ ํŒŒ์ดํ”„์™€ ์กฐํ•ฉํ•˜์—ฌ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# ํŒŒ์ผ์—์„œ ์ž…๋ ฅ์„ ๋ฐ›์•„๋“ค์ผ ๋•Œ #

$ awk 'pattern' filename

$ awk '{ action }' filename

$ awk 'pattern { action }' filename
# ์ปค๋งจ๋“œ์—์„œ ์ž…๋ ฅ์„ ๋ฐ›์•„๋“ค ๋•Œ ํŒŒ์ดํ”„์™€ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ #

$ command | awk 'pattern'

$ command | awk '{ action }'

$ command | awk 'pattern { action }'

awk ํŒจํ„ด ์ข…๋ฅ˜

 

๋น„๊ต์—ฐ์‚ฐ ํŒจํ„ด

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด, ํŒจํ„ด์€ ๊ฐ ๋ผ์ธ(ํ–‰) ๋“ค ์ค‘์—, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋ฝ‘์•„๋‚ด๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋น„๊ต ์—ฐ์‚ฐ ํŒจํ„ด์ธ๋ฐ, ๋งˆ์น˜ ์กฐ๊ฑด๋ฌธ ์ฒ˜๋Ÿผ ํ•ด๋‹น ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•œ ๋ฐ์ดํ„ฐ ๋ผ์ธ๋“ค์„ ๋ฝ‘์•„ ๋‚ธ๋‹ค. 

์ˆซ์ž, ์•ŒํŒŒ๋ฒณ ๋ชจ๋‘ ๋น„๊ต ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅ ํ•˜๋‹ค.
# ํŒŒ์ผ์—์„œ 3๋ฒˆ์งธ ํ•„๋“œ $3์˜ ๊ฐ’์ด 7000๋ณด๋‹ค ํด๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋“ค์„ printํ•œ๋‹ค.
$ awk '$3 > 7000 {print $1, $2}' filename

# ๋ณต์žกํ•œ ๋…ผ๋ฆฌ์‹ ์—ฌ๊นƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
$ awk '$3 > $5 && $3 <= 100' filename

 

์ •๊ทœํ‘œํ˜„์‹ ํŒจํ„ด

grep ๋ช…๋ น์–ด์™€ ๊ฐ™์ด ํŒจํ„ด ๋ถ€๋ถ„์— ์ •๊ทœ์‹ /regex/ ๋ฅผ ๋„ฃ์–ด์„œ ๋ผ์ธ์„ ๋ถ„๋ณ„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

# ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์—†๋Š” ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋’ค์— ์–ด๋А ํ•œ ๋ฌธ์ž๊ฐ€ ์˜ค๋Š” ๋ผ์ธ ๋งค์นญ
$ awk '/^[A-Z][a-z]+ /' filename

# "์ •" ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ผ์ธ์„ ๊ณจ๋ผ์„œ print
$ awk '/^์ •/{print $1, $2, $3}' filename
# POSIX ๋ฌธ์ž ํด๋ž˜์Šค
$ awk '/[[:lower:]]+g[[:space:]]+[[:digit:]]' filename

์ •๊ทœ์‹๊ณผ POSIX ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

 

[LINUX] ๐Ÿ“š ์ •๊ทœํ‘œํ˜„์‹ ๊ณผ grep ๋ช…๋ น์–ด ์ •๋ณตํ•˜๊ธฐ [ํŒจํ„ด ๊ฒ€์ƒ‰] [ํ™•์žฅ๋ธŒ๋ž˜ํ‚ท]

ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ ํŒจํ„ด ๊ฒ€์ƒ‰ ๋ฆฌ๋ˆ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๋กœ๊ทธํŒŒ์ผ์ด๋‚˜, ํ…์ŠคํŠธ ํŒŒ์ผ์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์„ ์ฐพ์„ ๋•Œ, ํ˜น์€ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์—์„œ ํŠน์ • ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

inpa.tistory.com

 

ํŒจํ„ด ๋งค์นญ ์—ฐ์‚ฐ

match ์—ฐ์‚ฐ์ž(~) : ํ‘œํ˜„์‹๊ณผ ๋งค์นญ๋˜๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์—ฐ์‚ฐ์ž

  • ~ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„
  • !~ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„

์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค. ๋ณดํ†ต ๊ฐ’์„ ๋น„๊ตํ• ๋•Œ, == ์—ฐ์‚ฐ์ž๋ฅผ ์“ฐ๋Š”๋ฐ, ํŒจํ„ด๋งค์นญ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„  == ๋Œ€์‹  match์—ฐ์‚ฐ์ž(~)๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.

# 2๋ฒˆ ํ•„๋“œ ๋ฌธ์ž์—ด์ด ๋ฌธ์ž g๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ๋ผ์ธ ์ถœ๋ ฅ
$ awk '$2 !~ /g$/' filename

 

BEGIN / END ํŒจํ„ด

awk ํŒจํ„ด(pattern) ์ค‘์—๋Š” "BEGIN" ๊ณผ "END" ๋ผ๊ณ  ํ•˜๋Š” ํŠน๋ณ„ํ•œ ํŒจํ„ด์ด ์กด์žฌํ•œ๋‹ค.

awk๊ฐ€ BEGIN ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๋ฉด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— "BEGIN"์— ์ง€์ •๋œ ์•ก์…˜์„ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "END" ํŒจํ„ด์€ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ "END"์— ์ง€์ •๋œ ์•ก์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์›๋ฆฌ์ด๋‹ค.

 

์ •๋ง ์•Œ๊ธฐ์‰ฝ๊ฒŒ ์˜ˆ์ œ๋กœ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

[file.txt ํŒŒ์ผ ๋‚ด์šฉ]

1 2
3 4
5 6
7 8
$ awk 'BEGIN { print "TITLE : Field value 1,2"} {print $1, $2} END {print "Finished"}' file.txt

๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ
๋ฆฌ๋ˆ…์Šค-awk-๋ฌธ๋ฒ•-์ •๋ฆฌ


awk ์ œ์–ด๋ฌธ

๋ฌธ๋ฒ• ์ž์ฒด๋Š” C์–ธ์–ด์˜ ์ œ์–ด๋ฌธ๊ณผ ๋น„์Šทํ•˜๋‹ค.

# if๋ฌธ
if ( condition ) { Routine } else { Routine }

# for๋ฌธ
for ( init ; condition ; re ) { Routine }

# while๋ฌธ
while (condition) { Routine }

# do ~ while๋ฌธ
do { Routine } while (condition)

# ๋ฐ˜๋ชฉ๋ฌธ ์ œ์–ด
break
continue
return

# ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด
next
exit

 

if๋ฌธ

# ๋‹จ์ผ if

$ awk '{if($6>50) print $1 "Too high" }' filename

$ awk '{if($6>20 && $6<=50) {safe++; print "OK"}}' filename
# if ~ else

$ awk '{if($6>50) print $1 "Too high"; else print "Range is OK"}' filename

$ awk '{if($6>50) {count++; print $3} else{x+5; print $2}}' filename

 

ํ•œ์ค„๋กœ ํ‘œํ˜„ํ•˜๋‹ค๋ณด๋‹ˆ ๊ต‰์žฅํžˆ ๊ฐ€๋…์„ฑ์ด ์•ˆ์ข‹๋‹ค.

๋‹คํ–‰ํžˆ awk๋Š” ๊ฐœํ–‰ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋‚ด์šฉ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

๊ฐ ๋ผ์ธ์—์„œ ์ฒซ๋ฒˆ์งธ ํ•„๋“œ $1๊ฐ€ "d" ๋กœ ์‹œ์ž‘ํ•˜๋ฉด, ์ฆ‰ ๋””๋ ‰ํ† ๋ฆฌ๋ผ๋ฉด ์ถœ๋ ฅํ•˜๊ณ  ์•„๋‹ˆ๋ฉด null๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ if๋ฌธ ์˜ˆ์ œ ์ด๋‹ค.

awk-๋ฌธ๋ฒ•-์ •๋ฆฌ

$ awk '{
if ($3 >=35 && $4 >= 35 && $5 >= 35)
	print $0,"=>","Pass";
else
	print $0,"=>","Fail";
}' filename


$ awk \ # \๋ฌธ์ž๋ฅผ ์จ๋„ ํ„ฐ๋ฏธ๋„์—์„œ ๊ฐœํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
'
{
if ($3 >=35 && $4 >= 35 && $5 >= 35)
	print $0,"=>","Pass";
else
	print $0,"=>","Fail";
}
'
# if elif else

$ awk '{
    total=$3+$4+$5;
    avg=total/3;
    
    if ( avg >= 90 ) 
    	grade="A";
    else if ( avg >= 80) 
    	grade ="B";
    else if (avg >= 70) 
    	grade ="C";
    else 
    	grade="D";

    print $0, grade;
 }' filename
# ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์—ญ์‹œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
$ awk '{max={$1 > $2) ? $1 : $2; print max}' filename

 

for๋ฌธ

$ awk '{for(i=1; i<=NF; i++) print NF, $1}' filename

$ awk '{
for(i=0;i<2;i++)
 print( "for loop :" i "\t" $1, $2, $3)
}' filename

 

while๋ฌธ

$ awk '{i=1; while(i<=NF) {print NF, $1; i++}}' filename

 

๋ฐ˜๋ณต๋ฌธ ์ œ์–ด

  • break : ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœ
  • continue : ๋‚จ์•„์žˆ๋Š” ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ๋ฐ˜๋ณต๋ฌธ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ œ์–ด๋ฅผ ์ด๋™
$ awk '{
    for(x=3; x<=NF; x++)
    	if($x<0) {print "Bottomed out!"; break}

    for(x=3; x<=NF; x++)
    	if($x==0) {print "Get next item"; continue}
 }' filename

 

ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด

  • next : ์ž…๋ ฅ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ ์ž…๋ ฅํ–‰์„ ๊ฐ€์ ธ์™€์„œ awk ์Šคํฌ๋ฆฝํŠธ์˜ ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹คํ–‰
  • exit : awk ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ. exit ๋ฌธ์€ ๋ ˆ์ฝ”๋“œ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค์ง€๋งŒ, END ๋ฌธ ๋„ˆ๋จธ๋กœ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š์Œ
# 1๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ Peter๋ฅผ ํฌํ•จํ•˜๋ฉด ์ด ํ–‰์„ ์ง€๋‚˜๊ณ  ๋‹ค์Œํ–‰์„ ์ž…๋ ฅ๋ฐ›๊ณ , ์Šคํฌ๋ฆฝํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹คํ–‰
$ awk '{
    if($1~/Peter/) {next}
    else {print}
 }' filename
$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{ print $0; exit }' file.txt # ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹คํ–‰ ์ค‘์ง€.
1 ppotta 30 40 50

$ awk 'NR == 2 { print $0; exit }' file.txt  # ๋‘ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹คํ–‰ ์ค‘์ง€.
2 soft   60 70 80
NR์€ ์ถœ๋ ฅ ์ˆœ๋ฒˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” awk ์ •์šฉ ๋‚ด์žฅ๋ณ€์ˆ˜์ด๋‹ค.

awk ์‚ฌ์šฉ์ž ๋ณ€์ˆ˜

์—ฌํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

$ awk '
BEGIN {
    sum = 0
    cnt = -1
}
{
    sum += $5
    cnt++
}
END {
    avg = sum/cnt
    print ("sum :" sum ", average :" avg)
}' filename

awk ๋ฆฌ๋‹ค์ด๋ ‰์…˜

awk๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ๋ˆ…์Šค ํŒŒ์ผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•  ๊ฒฝ์šฐ ์‰˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋‹ค๋งŒ > ๊ธฐํ˜ธ๊ฐ€ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž์ธ์ง€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ธ์ง€ ๋ชจํ˜ธํ• ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ action ๋ถ€๋ถ„์— > ๊ธฐํ˜ธ๊ฐ€ ์“ฐ์ด๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰์…˜, pattern ๋ถ€๋ถ„์— ์“ฐ์ด๋ฉด ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ด๋ผ๊ณ  ์น˜๋ถ€ํ•˜๋ฉด ๋œ๋‹ค.

ํŒŒ์ผ๋ช…์€ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋‘˜๋Ÿฌ์Œฐ์•„ ์ธ์‹ ๋œ๋‹ค.

  $ awk -F: '$4 >= 60000 {print $1, $2 > "new_file"}' awkfile5

.awk ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰

์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ .sh ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, awk์—ญ์‹œ ๊ฐ€๋Šฅํ•˜๋‹ค. -f ๋ช…๋ น์–ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด .awk ํ™•์žฅ์ž ํŒŒ์ผ์„ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์‰˜์Šคํฌ๋ฆฝํŠธ์—์„œ #!/bin/bash์™€ ๊ฐ™์ด awk ์ „์šฉ shabang์„ ์ž‘์„ฑํ•ด์ฃผ๊ณ , ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์ ์–ด์ฃผ๊ธฐ๋ฉด ํ•˜๋ฉด ๋œ๋‹ค. (๋‹จ, ์ฐธ์กฐํ•  ํŒŒ์ผ์€ ์ ์ง€ ์•Š๋Š”๋‹ค. ํŒŒ์ผ์€ ํ„ฐ๋ฏธ๋„ CLI๋ช…๋ น์œผ๋กœ ์ ๋Š”๋‹ค)

#!/bin/awk -f

BEGIN { print "File\tOwner" }
{ print $8, "\t", $3}
END { print " - DONE -" }
# ์‹คํ–‰๋ฐฉ์‹ : awk [-f์˜ต์…˜] [awk์Šคํฌ๋ฆฝํŠธํŒŒ์ผ] [์ฐธ์กฐํ• ํŒŒ์ผ]
$ awk -f script.awk filename

awk ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž ์„ค๋ช…
์‚ฐ ์ˆ  =, +=, -=, *=, /=, %=
์กฐ ๊ฑด ?, :
๋…ผ ๋ฆฌ   ||, &&, !
ํŒจ ํ„ด ~, !~
๋น„ ๊ต <, <=, >, >=, !=, ==
์ฆ ๊ฐ ++, --
ํ•„๋“œ์ฐธ์กฐ $

awk ๋‚ด์žฅ๋ณ€์ˆ˜

ํ‚ค์›Œ๋“œ ์„ค๋ช…
FILENAME  ํ˜„์žฌ ์ž…๋ ฅํŒŒ์ผ์˜ ์ด๋ฆ„
$0 ์ž…๋ ฅ ๋ ˆ์ฝ”๋“œ
$n ์ž…๋ ฅ ๋ ˆ์ฝ”๋“œ์˜ N๋ฒˆ์งธ ํ•„๋“œ
ENVIRON ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋ชจ์•„๋‘” ๊ด€๊ณ„ํ˜• ๋ฐฐ์—ด
NR ์ถœ๋ ฅ ์ˆœ๋ฒˆ 
NF ํ˜„์žฌ ์ค„์˜ ํ•„๋“œ์ˆ˜
ARGC ๋ช…๋ น์ค„ ์ธ์ž์˜ ๊ฐœ์ˆ˜
ARGV ๋ช…๋ น์ค„ ์ธ์ž๋“ค์˜ ๋ฐฐ์—ด
FNR ํ˜„์žฌํŒŒ์ผ์—์„œ์˜ ๋ ˆ์ฝ”๋“œ ๋ฒˆํ˜ธ
FS ์ž…๋ ฅ ํ•„๋“œ ๊ตฌ๋ถ„์ž
OFMT ์ˆซ์ž๋“ค์˜ ํ‘œํ˜„ํ˜•์‹
OFS ์ถœ๋ ฅํ•„๋“œ ๊ตฌ๋ถ„์ž
ORS  ์ถœ๋ ฅ ๋ ˆ์ฝ”๋“œ ๊ตฌ๋ถ„์ž
RS ์ž…๋ ฅ์ฝ”๋“œ ๊ตฌ๋ถ„์ž
EP ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์˜ ๊ตฌ๋ถ„์ž
RLENGTH match ํ•จ์ˆ˜๋กœ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
RSTART match ํ•จ์ˆ˜๋กœ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ์˜คํ”„์…‹

awk ๋‚ด์žฅํ•จ์ˆ˜

$ awk '{ print ("name leng : " length($1), "substr(0,3) : " substr($1,0,3)) }' filename

 

awk ๋ฌธ์ž์—ด ํ•จ์ˆ˜

 ํ•จ์ˆ˜๋ช…  ์„ค๋ช… 
 gsub(r, s)  ์ž…๋ ฅ ๋ฌธ์ž์—ด ์ „๋ถ€์— ๊ฑธ์ณ ์ •๊ทœ์‹ํ‘œํ˜„ r์„ ๋ฌธ์ž์—ด s๋กœ
 ์น˜ํ™˜ํ•œ๋‹ค.
 gsub(r, s1, s2)  ์ž…๋ ฅ๋ฌธ์ž์—ด s2 ์—์„œ ์ •๊ทœ์‹ ํ‘œํ˜„ r์„ ๋ฌธ์ž์—ด s1 ์œผ๋กœ
 ์น˜ํ™˜ํ•œ๋‹ค.
 index(s1, s2)  s1์—์„œ s2์˜ ์œ„์น˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค. ์—†๋‹ค๋ฉด 0
 length(arg)  ์ธ์ž์˜ ๊ธธ์ด๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
 match(s, r)  ๋ฌธ์ž์—ด s์—์„œ ์ •๊ทœ์‹ํ‘œํ˜„ r๊ณผ ๋งค์นญ ๋˜๋Š” ๋ถ€๋ถ„์˜ 
 ์œ„์น˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
 split(string, array[, seperator])  ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ(๊ธฐ๋ณธ:๊ณต๋ฐฑ)ํ•ด์„œ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์„ 
 ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค.
 sub(r, s) , sub(r, s1, s2)  gsub ์™€ ๋™์ผ
  ์ •๊ทœ์‹์‹ํ‘œํ˜„๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋„ 
 ์ฒ˜์Œ ํ•œ ๋ฌธ์ž์—ด๋งŒ ์น˜ํ™˜
 substr(s, m)  ๋ฌธ์ž์—ด s ์—์„œ m๋ฒˆ์งธ ์œ„์น˜์—์„œ ๋๊นŒ์ง€ ๋ฌธ์ž์—ด์„ 
 ๋„˜๊ฒจ์ค€๋‹ค.
 substr(s, m, n)  ๋ฌธ์ž์—ด s ์—์„œ m๋ฒˆ์งธ ๋ถ€ํ„ฐ n๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„
 ๋„˜๊ฒจ์ค€๋‹ค
 tolower(string)  ๋Œ€๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พผ๋‹ค.
 toupper(string)  ์†Œ๋ฌธ์ž๋ฅผ ๋Œ€๋ถ„์ž๋กœ ๋ฐ”๊พผ๋‹ค.

 

awk ์ˆ˜ํ•™ ํ•จ์ˆ˜

 ํ•จ์ˆ˜๋ช…  ์„ค๋ช… 
atan2(x, y)  archtangent ๊ฐ’
cos(x)  cos ๊ฐ’
exp(x)  ์ž์—ฐ๋Œ€์ˆ˜ e์˜ ์ œ๊ณฑ
int(x)  ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ˜ํ™˜
log(x)  ๋กœ๊ทธ
rand()  0์—์„œ 1๊นŒ์ง€์˜ ๋žœ๋ค์ˆ˜
sin(x)  sin ๊ฐ’
sqrt(x)  ์ œ๊ณฑ๊ทผ
srand(expr)  ์ธ์ž๋ฅผ ๊ฐ€์ง„ ๋‚œ์ˆ˜(์—†์œผ๋ฉด ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ๋‚œ์ˆ˜ ๋ฐœ์ƒ)

 

awk ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜

 ํ•จ์ˆ˜๋ช…  ์„ค๋ช… 
close(filename)  ์ง€์ •ํ•œ ํŒŒ์ผ์„ ๋‹ซ๋Š”๋‹ค.
close(cmd)  ์ง€์ •ํ•œ ๋ช…๋ น์–ด ํŒŒ์ดํ”„๋ฅผ ๋‹ซ๋Š”๋‹ค.
delete array[element]  ์ง€์ •ํ•œ ๋ฐฐ์—ด์š”์†Œ๋ฅผ ์ง€์šด๋‹ค.
getline()  ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ๋“ค์ธ๋‹ค.
getline [variable] [< "filename"]  ํŒŒ์ผ์—์„œ ์ฝ์–ด๋“œ๋ฆฐ๋‹ค.
next  ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
print [args] [> "filename"]  ์ธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค
printf "format" [,exp] [> "filename"]  ํ˜•์‹์— ๋งž์ถฐ ์ธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
sprintf(format [,exp])  printf์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๊ฐ’์„ 
 ๋ฆฌํ„ดํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ์ถœ๋ ฅ์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
system(cmd)  ์‹œ์Šคํ…œ ๋‚ด๋ถ€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

AWK ๋ช…๋ น ์‚ฌ์šฉ ์˜ˆ์ œ

 

ํ•„๋“œ ๊ฐ’ ์ถœ๋ ฅ ํ•˜๊ธฐ ($์ˆซ์ž)

$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{ print $1,$2 }' ./file.txt        # ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ํ•„๋“œ ๊ฐ’ ์ถœ๋ ฅ.
1 ppotta
2 soft
3 prog

$ awk '{ print $0 }' ./file.txt            # ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ.
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20
$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{print "no:"$1, "user:"$2}' ./file.txt # ํ•„๋“œ ๊ฐ’์— ๋ฌธ์ž์—ด์„ ํ•จ๊ป˜ ์ถœ๋ ฅ
no:1 user:ppotta
no:2 user:soft
no:3 user:prog

 

ํŒจํ„ด ์ด์šฉ (์ •๊ทœ์‹ / ๋น„๊ต์‹)

$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '/pp/' ./file.txt                   # "pp" ๊ฐ€ ํฌํ•จ๋œ ๋ ˆ์ฝ”๋“œ๋งŒ ์œ ํšจ.
1 ppotta 30 40 50

$ awk '/[2-3]0/' ./file.txt               # 20, 30 ์ด ํฌํ•จ๋œ ๋ ˆ์ฝ”๋“œ๋งŒ ์œ ํšจ.
1 ppotta 30 40 50
3 prog   90 10 20
$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '$1 == 2 { print $2 }' ./file.txt   # ์ฒซ ๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ 2์ธ ๋ ˆ์ฝ”๋“œ์˜ ๋‘ ๋ฒˆ์งธ ํ•„๋“œ ์ถœ๋ ฅ.
soft

$ awk '$3 > 70 { print $0 }' ./file.txt   # ์„ธ ๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ 70๋ณด๋‹ค ํฐ ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ.
3 prog   90 10 20

$ awk '$3 == 30 && $4 ==40 { print $2 }' file.txt   # ์„ธ ๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ 30์ด๊ณ  ๋„ค ๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ 40์ธ ๋ ˆ์ฝ”๋“œ์˜ ๋‘ ๋ฒˆ์งธ ํ•„๋“œ ์ถœ๋ ฅ.
ppotta
$ cat str.txt
a b c
d e f
g h i

$ cat c.txt | awk '$1=="a"' str.txt # ํŠน์ • ๋ ˆ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅ
a b c

$ cat c.txt | awk '$1!="a"' str.txt # ํŠน์ • ๋ ˆ์ฝ”๋“œ ์ œ์™ธ ์ถœ๋ ฅ
d e f
g h i

$ cat c.txt | awk '$2~/^e/' str.txt # ํŒจํ„ด๋น„๊ต. $2ํ•„๋“œ๊ฐ€ ๋ฌธ์že ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅ
d e f

 

CSVํŒŒ์ผ ์ฒ˜๋ฆฌํ•˜๊ธฐ (-F ์˜ต์…˜)

์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” -F ์˜ต์…˜์—์„œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์žฌ์ง€์ • ํ•˜๋ฉด ๋œ๋‹ค.

$ cat test.csv
1,2,3
4,5,6
7,8,9

$ cat b.txt | awk -F, '{print $1}' # -F์˜ต์…˜์„ ํ†ตํ•ด , ๋กœ ๊ตฌ๋ถ„๊ธฐํ˜ธ๋ฅผ ์žฌ์ง€์ •ํ•˜๊ณ  $1ํ•„๋“œ๋งŒ ์ถœ๋ ฅ
1
4
7

 

ํ–‰ ๋ฒˆํ˜ธ ์ถœ๋ ฅํ•˜๊ธฐ (NR ๋‚ด์žฅ๋ณ€์ˆ˜)

ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” print ์— NR ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • NR์€ awk ๋‚ด์žฅ๋ณ€์ˆ˜๋กœ์„œ ๋ช‡๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ์ธ์ง€ ์ˆœ๋ฒˆ ์ถœ๋ ฅํ•œ๋‹ค
  • $0 ์€ ๋ ˆ์ฝ”๋“œ ํ•œ ์ค„ ์ถœ๋ ฅ
$ cat test.csv
1,2,3
4,5,6
7,8,9

$ cat test.csv | awk -F, '{print NR " " $0;}'
1 1,2,3
2 4,5,6
3 7,8,9

$ awk_example]$ cat test.csv | awk -F, '{print NR-1 " " $0;}' # 0๋ถ€ํ„ฐ ์‹œ์ž‘
0 1,2,3
1 4,5,6
2 7,8,9

 

์‚ฐ์ˆ  ๊ณ„์‚ฐ

$ cat num.txt
100
200
300
400
500

$ awk '{sum+=$1} END {print sum}' num.txt # ํ•ฉ๊ณ„ ๊ณ„์‚ฐ. ENDํŒจํ„ด์„ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋Œ๋„ ๋‚œ ํ›„ ๋งˆ์ง€๋ง‰์— ํ•ฉ์„ ์ถœ๋ ฅ
1500

$ awk '{sum+=$1} END {print sum/NR}' num.txt # ํ‰๊ท  ๊ณ„์‚ฐ. ๋‚ด์žฅ๋ณ€์ˆ˜ NR์€ ์ถœ๋ ฅ์ˆœ๋ฒˆ๊ฐ’. ์ฆ‰ ๋ ˆ์ฝ”๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์˜๋ฏธ
300

## NR==1 {max=$1} ์ด๋ผ๋Š” ๋œป์€ ์ตœ๋Œ€/์ตœ์†Œ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๊นƒ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋กœ์ง. ์ถœ๋ ฅ์ˆœ๋ฒˆ์ด ์ฒซ๋ฒˆ์งธ ์ผ๋–„๋งŒ max๋ณ€์ˆ˜์— $1๊ฐ’ ์ €์žฅ
$ awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' num.txt # ์ตœ๋Œ“๊ฐ’ ๊ณ„์‚ฐ
500

$ awk 'NR==1 {min=$1} {if($1 < max) min = $1} END {print min}' d.txt # ์ตœ์†Ÿ๊ฐ’ ๊ณ„์‚ฐ
100
$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{ sum = 0 } {sum += ($3+$4+$5) } { print $0, sum, sum/NR }' ./file.txt # ํ•ฉ๊ณ„์™€ ํ‰๊ท  ๊ตฌํ•˜๊ธฐ
1 ppotta 30 40 50 120 40
2 soft   60 70 80 210 70
3 prog   90 10 20 120 40

 

printf ํฌ๋งทํŒ…

C์–ธ์–ด์˜ printf() ํ•จ์ˆ˜์—๋Š” ํฌ๋งท์ง€์ •์ž๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฅผํ†ตํ•ด ์ถœ๋ ฅ ์นธ ์ˆ˜ ๋„ˆ๋น„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

awk์—์„œ๋„ ๋˜‘๊ฐ™์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

printf ํฌ๋งทํŒ…

$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{ printf "%-3s %-8s %-4s %-4s %-4s\n", $1, $2, $3, $4, $5}' file.txt
1   ppotta   30   40   50  
2   soft     60   70   80  
3   prog     90   10   20

 

์กฐ๊ฑด๋ฌธ

$ cat file.txt
name    phone           birth           sex     score
reakwon 010-1234-1234   1981-01-01      M       100
sim     010-4321-4321   1999-09-09      F       88

$ awk '{ if ( $5 >= 80 ) print ($0) }' file.txt # score๊ฐ€ 80์  ์ด์ƒ ๋ ˆ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅ

$ awk '$5 >= 80 { print $0 }' ./awk_test_file.txt # action๋ถ€๋ถ„์— if๋ฅผ ์“ฐ๋“  pattern๋ถ€๋ถ„์— ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์“ฐ๋“  ๊ฒฐ๊ณผ๋Š” ๋™์ผ

 

๋ฃจํ”„๋ฌธ

NF : awk ๋‚ด์žฅ๋ณ€์ˆ˜. ํ˜„์žฌ ์ค„์˜ ํ•„๋“œ ๊ฐฏ์ˆ˜

$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{ for (i=3; i<=NF; i++) total += $i }; END { print "TOTAL : "total }' ./file.txt # ๊ฐ ๋ ˆ์ฝ”๋“œ์˜ $3 ~ $5 ํ•„๋“œ ์ดํ•ฉ
TOTAL : 450

 

๋‚ด์žฅํ•จ์ˆ˜ ์‚ฌ์šฉ

$ cat e.txt
a
ab
abc
abcd
abcde

$ cat e.txt | awk '{print length();}' # ๊ฐ ํ–‰์˜ ๋ฌธ์ž์ˆ˜ ๊ตฌํ•˜๊ธฐ
1
2
3
4
5

 

ํŒŒ์ดํ”„ ์กฐํ•ฉ

$ cat file.txt
1 ppotta 30 40 50
2 soft   60 70 80
3 prog   90 10 20

$ awk '{ print $0 }' file.txt | sort -r   # awk ์ถœ๋ ฅ ๋ ˆ์ฝ”๋“œ๋ฅผ ํŒŒ์ดํ”„๋กœ ๋ณด๋‚ด ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ.
3 prog   90 10 20
2 soft   60 70 80
1 ppotta 30 40 50

# ์ฐธ๊ณ ์ž๋ฃŒ

https://zzsza.github.io/development/2017/12/20/linux-6/

https://reakwon.tistory.com/163

https://recipes4dev.tistory.com/171

http://egloos.zum.com/bosoa/v/3932702

https://blog.muabow.com/185

https://techgoeasy.com/unix-awk-command/

https://jhnyang.tistory.com/494