https://jherrlin.github.io/posts/learn-awk/ ์ด ๊ณณ์˜ ๊ธ€์„ ์˜ฎ๊ธด๋‹ค. ์•ฝ๊ฐ„ ์ˆ˜์ • ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

(Herrlin [2020] 2022)

Intro

์ด ๊ฒŒ์‹œ๋ฌผ์€ Emacs, Org ๋ชจ๋“œ ๋ฐ Org-drill ์„ ์‚ฌ์šฉํ•˜์—ฌ AWK ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ์ž‘์—… ํ๋ฆ„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์›Œํฌํ”Œ๋กœ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ๊ธ€์€ Emacs, ์กฐ์ง ๋ชจ๋“œ ๋˜๋Š” ์กฐ์ง ๋“œ๋ฆด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ”Œ๋ž˜์‹œ ์นด๋“œ, ๋…ธํŠธ ๋ฐ ์ผ๋ถ€ ํ…์ŠคํŠธ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ git repo ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Content

๋ฐฉ๊ธˆ "The AWK ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด" ์ฑ…์—์„œ ๋ช‡ ์žฅ์„ ์ฝ์—ˆ๊ณ  AWK ๊ฐ€ ํ›Œ๋ฅญํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ณ  ์–ธ์–ด์— ๋Œ€ํ•ด ๋” ๋ฐฐ์šฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” AWK ๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ๋‚˜์˜ ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋‚ด ๋ชฉํ‘œ๋Š” ๋” ์ž‘์€ ์Šคํฌ๋ฆฝํŠธ์™€ ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ๋กœ AWK ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. AWK ๋Š” Turing complete ํ•˜๋ฉฐ ๋” ํฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ํฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฌด๊ธฐ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜ํ˜• ๋ฆฌ์Šคํ”„ ์ž…๋‹ˆ๋‹ค. AWK ๋Š” ๋‚ด ๋„๊ตฌ ์ƒ์ž์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ํˆด์ด์ž ๋กœ๊ทธ ํ•„ํ„ฐ๋ง, ํŒŒ์ผ์˜ ํŒจํ„ด ๊ฒ€์ƒ‰, ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ ์ถ•์†Œ, ๋‚ด ํšŒ๊ณ„ ๋ฐ์ดํ„ฐ ๋˜๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์™„๋ฒฝํ•œ ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, find, sed, grep ๋ฐ sort AWK ์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ AWK ๊ฐ€ ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

=๋ฐฐ์›€์˜ ๊ณผ์ •=์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐฐ์šฐ๊ณ  ์ง€์‹์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์‹œ๊ฐ„์ด ์—†๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฒœ์ฒœํžˆ ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฐœ์ „ํ•˜๊ณ  ์‹ถ๋‹ค. ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด ์žˆ๊ฑฐ๋‚˜ ์ž ์‹œ ๋™์•ˆ AWK ์—์„œ ๋–จ์–ด์ ธ ์žˆ๋”๋ผ๋„, ์ฑ…์„ ๋‹ค์‹œ ์ฝ๊ฑฐ๋‚˜ ๋งŽ์€ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•  ํ•„์š” ์—†์ด ๋น ๋ฅด๊ฒŒ ์ •์ƒ ๊ถค๋„๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์ด ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ AWK ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ œ 2 ์˜ ๋‘๋‡Œ์— ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋”ํ•  ๋‚˜์œ„ ์—†์ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์€ ์ œ๊ณต๋œ ํ…์ŠคํŠธ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ Org-drill ๋ฐ Org ๋ชจ๋“œ ์†Œ์Šค ๋ธ”๋ก์„ ๊ฒฐํ•ฉํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค. Org-drill ์€ ํ”Œ๋ž˜์‹œ ์นด๋“œ์™€ ํ•จ๊ป˜ ๊ฐ„๊ฒฉ ๋ฐ˜๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•˜๋Š” Emacs ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„ Nginx ์•ก์„ธ์Šค ๋กœ๊ทธ, /etc/passwd ๋˜๋Š” .ledger ํŒŒ์ผ๊ณผ ๊ฐ™์€ "์œ ๋ช…ํ•œ" ํ…์ŠคํŠธ ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์†Œ์Šค๋ฅผ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์œผ๋กœ ์ฑ„์šฐ๋Š” ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ํ๋ฆ„์€ ์ฑ…์˜ ํ•œ ์žฅ์ด๋‚˜ ์„ค๋ช…์„œ ํŽ˜์ด์ง€๋ฅผ ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒƒ์„ ์ฐพ์œผ๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”Œ๋ž˜์‹œ ์นด๋“œ๋ฅผ ์”๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง€์‹ ์†Œ์Šค๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๊ณ  ์‹œ๊ฐ„์ด ์ข€ ๋‚จ์•˜๋‹ค๊ณ  ๋Š๋‚„ ๋•Œ ํ•™์Šต ์›Œํฌํ”Œ๋กœ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ์›Œํฌํ”Œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Open 2 Emacs sessions
  2. Open the file containing the flash cards in one session
  3. Open a note book file in the other
  4. Start org-drill in the flash cards session
  5. Write your answers in the note book session

๋…ธํŠธ ํŒŒ์ผ ๋ฐ ํ”Œ๋ž˜์‹œ ์นด๋“œ์™€ ํ•จ๊ป˜ ๋‘ ๊ฐœ์˜ ํ…์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ํŒŒ์ผ์€ "์œ ๋ช…ํ•œ" ํŒŒ์ผ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋…ธํŠธ๋ถ ํŒŒ์ผ์—๋Š” ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•œ ์กฐ์ง ๋ชจ๋“œ ์†Œ์Šค ๋ธ”๋ก์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์งˆ๋ฌธ์€ ํŠน์ • ์งˆ๋ฌธ์— ์‚ฌ์šฉํ•  ์†Œ์Šค ๋ธ”๋ก์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋…ธํŠธ๋ถ ํŒŒ์ผ ๋‚ด๋ถ€์˜ ์†Œ์Šค ๋ธ”๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  { print }

ํ‰๊ฐ€ํ•  ์–ธ์–ด๊ฐ€ AWK ์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์†Œ์Šค ๋ธ”๋ก ๋ฐ”๋กœ ์•„๋ž˜์— ์žˆ๋Š” ๋…ธํŠธ ๋ถ ๋ฌธ์„œ์— ์‚ฝ์ž…๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. AWK ํ”„๋กœ๊ทธ๋žจ์ด ์ž…๋ ฅ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŒŒ์ผ์€ :in-file ์ธ์ˆ˜์— ์žˆ์Šต๋‹ˆ๋‹ค. C-c C-c ๊ฐ€ ์ด ์†Œ์Šค ๋ธ”๋ก์—์„œ ์‹คํ–‰๋˜๋ฉด ๋…ธํŠธ๋ถ ๋ฌธ์„œ์— ./text-files/access.log ํŒŒ์ผ์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฌธ์„œ์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‹ต๋ณ€์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. AWK ๋‹ต๋ณ€์„ ์ž‘์„ฑํ•˜๊ณ  C-c C-c ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์กฑ์Šค๋Ÿฝ๊ณ  ์ •๋‹ต์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด org-drill ์„ธ์…˜์— ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ •๋‹ต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. org-drill ์— 1-5 ์  ์ฒ™๋„์—์„œ ์–ผ๋งˆ๋‚˜ ์ž˜ํ–ˆ๋Š”์ง€ ๋งํ•จ์œผ๋กœ์จ ์ž์‹ ์„ ๋ฐ”๋กœ์žก์Šต๋‹ˆ๋‹ค. ๋‹ต๋ณ€์„ ์–ด๋–ป๊ฒŒ ํ‰๊ฐ€ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ org-drill ์€ ๋‹ค์Œ์— ์งˆ๋ฌธ์ด ๋‚˜ํƒ€๋‚  ๋‚ ์งœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  { ips[$1]+=1 }
  END { for (i in ips) { print i, ips[i] | "sort -rk 2,2"}}
121.204.106.181 8
191.54.160.135 7
111.185.35.101 1
111.85.5.44 1
101.11.117.117 1

๋‹ค์Œ์€ ํ”Œ๋ž˜์‹œ ์นด๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์กฐ์ง ๋ชจ๋“œ์˜ ๊ธฐ๋ณธ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๊ตฌ์กฐ๊ฐ€ ๋งค์šฐ ์นœ์ˆ™ํ•˜๊ฒŒ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ํ•œ ๊ฐ€์ง€ ํฐ ์ด์ ์€ ๊ทธ๊ฒƒ์ด ๋‹จ์ง€ ํ…์ŠคํŠธ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์ด์ƒํ•œ ๋ฌผ๊ฑด์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์šด ์ผ๋ฐ˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

Print line 7 to 10 of file

How do you print line 7 to 10 with a range pattern? :in-file ./text-files/ledger.ledger

Answer

  FNR==7,FNR==10
  2020-04-17 * Dustin. Kรถp av tangentbord.
  ;; ~/company/incomming-invoices/2020/2020-04-17-lenovo-keyboard-swedbank-transaction.pdf
     2:4:4:0                                   667.00 SEK
  2:0:1:8                                  -667.00 SEK

์–ธ์–ด ํ•™์Šต์„ ์œ„ํ•œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์„ค์ •์€ ์ €์—๊ฒŒ ๋งค์šฐ ๋งค๋ ฅ์ ์œผ๋กœ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ์ •์˜๋œ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  AWK ํ”„๋กœ๊ทธ๋žจ์ด ์งง๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ AWK ๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•  ๋•Œ ๋‚˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋ง‰ ๋๋‚ด๊ณ  ๋ชจ๋“  ์กฐ๊ฐ์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ข‹์€ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์œผ๋กœ ๋‘ ๋ฒˆ์งธ ๋‘๋‡Œ๋ฅผ ์ฑ„์šฐ๊ณ  ํ–‰๋ณตํ•œ AWK ์‚ฌ์šฉ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธธ์„ ๊ณ„์†ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์ž‘์—… ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜ ์ข‹์€ ํ”Œ๋ž˜์‹œ ์นด๋“œ๋กœ ๊ธฐ์—ฌํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด GitHub ๋ฅผ ํ†ตํ•ด ํ’€ ์š”์ฒญ์„ ๋ฐ›๊ฑฐ๋‚˜ Twitter ๋ฅผ ํ†ตํ•ด ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

#Backlink

Related-Notes

References

Herrlin, John. (2020) 2022. โ€œLearn the AWK Programming Language with Emacs Org-drill #Awk.โ€ https://github.com/jherrlin/learn-awk.