awk ¸í·É¾î »ç¿ë¹ý 2007/02/27 10:37 http://blog.naver.com/redaneme/120035114620 Ãâó : http://cafe.naver.com/sunschool/577 SUBJECT: Awk ¸í·É¾î »ç¿ë¹ý o awk ¸í·É¾î awk¶ó´Â À̸§Àº À̸¦ °³¹ßÇÑ ¼¼ »ç¶÷ÀÇ À̸§ Aho, Weinberger, Kernighan¿¡¼­ À¯·¡µÈ °ÍÀÌ´Ù. awk¸í·É¾î´Â ÀÏ·ÃÀÇ ÀÔ·Â È­ÀÏÀ» Àоî öÁ¤µ?ÆÐÅÏ°ú ÀÏÄ¡ÇÏ´Â ÆÐÅÏÀ» °£Á÷ÇÑ ¶óÀÎÀ» ã´Â´Ù. ÆÐÅÏÀÌ ÀÏÄ¡Çϸé ÁöÁ¤µÈ ¿¬»êÀÌ ½ÇÇàµÈ´Ù. ¿©±â¼­ÀÇ ¿¬»êÀº ¶óÀÎ ³»ÀÇ Çʵå Á¶ÀÛÀ̳ª Çʵ尪À» ÀÌ¿ëÇÑ »ê¼ú ¿¬»êÀ» ÀǹÌÇÑ´Ù. ÀÌ awk´Â shell programming°ú bc ±×¸®°í C ÇÁ·Î±×·¡¹Ö¾ð¾îÀÇ ±â´ÉÀ» °®Ãá ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î bc¿Í °°ÀÌ ¿Ïº®ÇÏ°Ô Çص¶ÀÌ µÇ¸ç ½©ÀÇ ÀμöÀÎ $1, $2, $3°ú °°Àº À̸§À» °¡Áø ÇÊµå º¯¼ö°¡ °¢ ÀÔ·Â ¶óÀο¡ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¶Ç C ¾ð¾î¿Í À¯»çÇÑ ÇÁ¸°ÆÃ, Á¦¾î ¿¬»êÀÚµµ °¡Áö°í ÀÖ´Ù. awkÀÇ »ç¿ë¿¡´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ÇÑ°¡Áö ¹æ¹ýÀº ´ÙÀ½ Çü½ÄÀ¸·Î ŸÀÌÇÁÇÏ´Â °ÍÀÌ´Ù. # awk program filename --> program: ¸í·É¾îµé·Î ÀÌ·ç¾îÁü filename: awk°¡ ÀÛ¿ëÇÒ È­ÀÏÀÇ ¸íĪ # awk -f file filename --> file: ÇÁ·Î±×·¥ ¸í·É¾îµéÀ» Æ÷ÇÔÇÏ°í ÀÖ´Â È­ÀÏÀÇ ¸íĪ ÇÁ·Î±×·¥Àº Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ÇÁ·Î±×·¥ ¶óÀεé·Î ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥ ¶óÀÎÀº ÀϹÝÀûÀ¸·Î ÆÐÅÏ°ú ÀÛ¿ëÀ¸·Î ÀÌ·ç¾îÁø´Ù. /rotate/ {print} --> ÆÐÅÏÀº rotate(´Ü¼øÇÑ ¹®ÀÚ¿­ ÆÐÅÏÀº /µé·Î µÑ·¯½ÎÀÓ) ÀÛ¿ëÀº printÀÌ´Ù. ÀÌ°ÍÀ» »ç¿ëÇϸé , awk ÇÁ·Î±×·¥Àº ¹®ÀÚ¿­ rotate¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¶óÀεéÀ» ¹ß°ßÇÏ°í ±×°ÍµéÀ» ÇÁ¸°Æ®ÇÑ´Ù. ±×°ÍÀº grep rotate filenameÀ» »ç¿ëÇÏ´Â °Í°ú °°´Ù. ÇʵåµéÀº °ø¹éµé¿¡ ÀÇÇØ ºÐ¸®µÈ ¹®ÀÚ¿­µéÀÌ´Ù. awk ÇÁ·Î±×·¥Àº Çʵ忡 ´ëÇÑ ·¹ÀÌºí ½Ã½ºÅÛÀ» °¡Áö°í ÀÖ´Ù. $1Àº ù ¹ø° ÇʵåÀÌ°í $2Àº µÎ ¹ø° ÇʵåÀÌ´Ù. $0Àº Ư¼öÇÑ Àǹ̸¦ °®´Â¹Ù, ±×°ÍÀº Àüü ¶óÀÎÀ» ³ªÅ¸³½´Ù. --------------------------------------------------------------------------------------------- ÆÐ ÅÏ ÀÇ ¹Ì --------------------------------------------------------------------------------------------- /fish/ ¹®ÀÚ¿­ fish¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¶óÀÎ $1 - /fish/ ù¹ø° Çʵ尡 ¹®ÀÚ¿­ fish¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¶óÀÎ $3 - /fish/ ¼¼¹ø° " " $1! - /fish/ ù¹ø° Çʵ尡 ¹®ÀÚ¿­ fish¸¦ Æ÷ÇÔÇÏ°í ÀÖÁö ¾ÊÀº ¶óÀÎ --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- ÀÛ ¿ë ÀÇ ¹Ì --------------------------------------------------------------------------------------------- {print $2} µÎ¹ø° Çʵ常À» ÇÁ¸°Æ®Ç϶ó {print $4,$2} ³×¹ø° ÇʵåÀÇ ³»¿ëÀ» ÇÁ¸°Æ®ÇÑ ´ÙÀ½ µÎ¹ø° ÇʵåÀÇ ³»¿ëÀ» ÇÁ¸°Æ®Ç϶ó {print $2,$2+$4} µÎ¹ø° Çʵ带 ÇÁ¸°Æ®ÇÑ ´ÙÀ½ µÎ¹ø° Çʵå¿Í ³×¹ø° ÇʵåÀÇ ÇÕÀ» ÇÁ¸°Æ®Ç϶ó {s=$2+$4; print s} µÎ¹ø°¿Í ³×¹ø° Çʵ带 Ãß°¡ÇÑ ´ÙÀ½, ±× ÇÕÀ» ÇÁ¸°Æ®Ç϶ó --------------------------------------------------------------------------------------------- ÆÐÅÏ¿¡¼­ÀÇ ~¿Í !»ç¿ë¿¡ ÁÖ¸ñÇ϶ó. ~´Â ¿ìÃø¿¡ ÀÖ´Â ÆÐÅÏÀÌ ÁÂÃø¿¡ ÀÖ´Â Çʵ忡 Æ÷ÇԵȴٴ °ÍÀ» ÀǹÌÇÑ´Ù. !~ Á¶ÇÕÀº ¿ìÃøÀÇ ÆÐÅÏÀÌ ÁÂÃøÀÇ Çʵ忡 Æ÷ÇÔµÇÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù. { }ÀÛ¿ëµéÀ» ¼¼¹ÌÄÝ·ÐÀ¸·Î ºÐ¸®½ÃÅ´À¸·Î½á Çϳª ÀÌ»óÀÇ ÀÛ¿ëµéÀ» Æ÷ÇÔ½ÃÅ´ ¼ö ÀÖ´Ù. ¸î°¡Áö ÀÌ·¯ÇÑ °³³äµéÀ» »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹¸¦ °íÂûÇغ¸ÀÚ. È­ÀÏ sales´Â ¿©¼¸ ¿­ÀÇ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. ù¹ø° ¿­Àº Ç°¸ñ ¸íĪ, µÎ¹ø° ¿­Àº Ç°¸ñÀÇ ÆǸŰ¡°Ý , ±×¸®°í ´ÙÀ½ÀÇ ³× ¿­µéÀº Ç°¸ñ¿¡ ´ëÇÑ ºÐ±âº° ÆǸżöÀÌ´Ù. # vi sales carts 29.99 45 13 55 22 corks 0.02 30 20 25 93 doors 49.99 40 15 20 25 geese 15.00 2 8 1 128 nighties 50.00 11 23 15 82 ¿ì¸®´Â µÎ ¿­À» Ãß°¡ÇÏ·Á ÇÑ´Ù. Ç°¸ñÇÕ°è ±×¸®°í Çö±Ý ÆǸŠÇÕ°è. ´ÙÀ½°ú °°Àº addupÀ̶ó´Â È­ÀÏÀ» ÀÛ¼ºÇÑ´Ù. # vi addup {total=$3+$4+$5+$6;print $0, total, total*$2} ÀÌ ÀÛ¿ëÀº ;¿¡ ÀÇÇØ ºÐ¸®µÈ µÎ ºÎºÐµéÀ» °¡Áö°í ÀÖ´Ù. ù ºÎºÐÀº ÆǸżö¸¦ ÇÕÇÏ°í ¿µ¸®ÇÏ°Ôµµ Çհ踦 totalÀ̶ó ºÎ¸¥´Ù. µÎ¹ø° ºÎºÐÀº ¿ø·¡ÀÇ ¶óÀÎ($0)À» ÇÁ¸°Æ®ÇÏ°í, ±× µÚ¿¡ Çհ踦 , ±× ´ÙÀ½¿¡´Â total*$2¸¦ ÇÁ¸°Æ®Çϴµ¥, ÀÌ°ÍÀº ÇÕ°èxµÎ¹ø° ¿­À» ÀǹÌÇÑ´Ù. # awk -f addup sales carts 29.99 45 13 55 22 135 4040.64 corks 0.02 30 20 25 93 93 3.36 doors 49.99 40 15 20 25 100 4999 geese 15.00 2 8 1 128 139 2085 nighties 50.00 11 23 15 82 131 6550 o awk ÀÔ·Â ¶óÀÎÀ» Àд ¹æ¹ý Ç¥ÁØ ÀÔ·ÂÀ̳ª È­ÀϷκÎÅÍ ÀÐÇôÁö´Â °¢ ¶óÀÎÀº °ø¹é¹®ÀÚ·Î ±¸ºÐµÈ Çʵ带 °¡Áö°í ÀÖ´Â °ÍÀ¸·Î °£ÁֵȴÙ. -F(field)¼±ÅÃÀÚ µÚ¿¡ ÀÓÀÇÀÇ ¹®ÀÚ¸¦ ÀÔ·ÂÇϸé ÇÊµå ±¸ºÐÀÚ°¡ ±× ¹®ÀÚ·Î º¯°æµÈ´Ù. ¿¹¸¦ µé¾î :(ÄÝ·Ð)À» ±¸ºÐÀÚ·Î »ç¿ëÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù. # awk -F: -f prog files o awkÀÇ ÆÐÅÏ°ú ¿¬»ê awk°¡ ÀоîµéÀÌ´Â ¶óÀΰú Çʵåµé¿¡ ´ëÇÑ ÀÛ¾÷Àº ÆÐÅÏ-¿¬»êÀÇ ½ÖÀ¸·Î Á¤ÀǵǸç À̽ÖÀº ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù. pattern {action} ¿¬»ê ºÎºÐÀ» Áß°ýÈ£·Î µÑ·¯½ÓÀ¸·Î½á ÆÐÅÏ°ú ±¸ºÐÇÑ´Ù. ¿¬»ê ºÎºÐÀÌ »ý·«µÇ¸é ±× ¶óÀÎÀÌ ÇÁ¸°Æ®µÈ´Ù. ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ¿¬»ê¿¡´Â print°¡ ÀÖÀ¸¸ç ÀÌ ¿¬»êÀº Àμö¸¦ Ç¥ÁØ Ãâ·Â¿¡ Ãâ·ÂÇÑ´Ù. ´ÙÀ½¿¬»êÀº ÀÔ·Â ÇÊµå °³ÀÇ ¼ø¼­¸¦ ¹Ù²Ù¾î Ãâ·ÂÇÑ´Ù. { print $2, $1} # vi in.file hello goodbye again 111 222 thirty forty # vi awk.prog1 {print $2, $1} # awk -f awk.prog1 in.file goodbye hello 222 111 forty thirty À§ÀÇ ¿¹¿¡¼­ printÀÇ Àμö´Â ÄÞ¸¶·Î ±¸ºÐµÇ¾úÀ¸¸ç ÀÌ·Î ÀÎÇØ Ãâ·Â µ¥ÀÌÅÍ »çÀÌ¿¡ ÇöÀçÀÇ ÇÊµå ±¸ºÐÀÚ°¡ »ðÀԵǾú´Ù. ÄÞ¸¶°¡ »ý·«µÇ¸é $1°ú $2°¡ ¿¬¼ÓÇÏ¿© Ãâ·ÂµÈ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ÀÇ awk ÇÁ·Î±×·¥Àº # vi awk.prog2 /hello/ {print $2, $1} # awk -f awk.prog2 in.file --> ÀÔ·Â È­ÀÏ ³»¿¡¼­ ÆÐÅÏ /hello/°ú ÀÏÄ¡ÇÏ´Â ¶óÀÎÀº 1°³»ÓÀ̱â goodbye hello ¶§¹®¿¡ ±× ¶óÀο¡ ´ëÇؼ­¸¸ ÁöÁ¤µÈ ¿¬»êÀÎ print°¡ ½ÇÇàµÇ¾ú´Ù. # vi awk.prog3 /hello/ {print $2, $1} /thirty/ {print $1, $2, "and more"} # awk -f awk.prog3 in.file --> print¸í·É¾îÀÇ Àμö°¡ µû¿ÈÇ¥·Î µÑ·¯½Î¿© Á¦°øµÇ¾úÀ¸¸ç ±× ¹®ÀÚ¿­ÀÌ goodbye hello Ãâ·Â¿¡ Ç¥½ÃµÇ¾ú´Ù. thirty forty and more # vi awk.prog4 /hello/||/111/ {print "htt", $1, $2} # awk -f awk.prog4 in.file --> ||¿¬»êÀÚ´Â 2°³ÀÇ Á¤±Ô½Ä Áß Çϳª¸¸ ÀÏÄ¡Çϸé ÁöÁ¤µÈ ¿¬»êÀ» ½ÇÇàÇϸç hit hello goodbye &&¿¬»êÀÚ´Â 2°³ÀÇ Á¤±Ô½ÄÀÌ ¸ðµÎ ÀÏÄ¡¾ÖÇá ÁöÁ¤ ¿¬»êÀ» ½ÇÇàÇÑ´Ù. hit 111 222 !¿¬»êÀÚ´Â Á¤±Ô½ÄÀÌ ÀÏÄ¡ÇÏÁö ¾Ê¾Æ¾ß ÁöÁ¤µÈ ¿¬»êÀ» ½ÇÇàÇϸç Á¤±Ô½Ä ¾Õ¿¡ ±â¼úµÈ´Ù. # vi awk.prog5 /^[Hh1]/ {print "htt", $0} # awk -f awk.prog5 in.file --> $0À» »ç¿ëÇ߱⠶§¹®¿¡ ÀÔ·Â ¶óÀÎ Àüü°¡ Ãâ·ÂµÇ¾úÀ½ hit hello goodbye again Hh1À¸·Î ½ÃÀÛÇÏ´Â lineÀ» Ãâ·Â hit 111 222 # vi awk.prog6 /hello/ { print $2 print "another" print $1 } # awk -f awk.prog6 in.file --> ÆÐÅÏ /hello/¿Í ÀÏÄ¡Çϴ ù¹ø° ÀÔ·Â ¶óÀθ¸ÀÌ ¿¬»êÀÇ ´ë»óÀÌ µÊ goodbye another hello o awk¸¦ ÀÌ¿ëÇÑ ¼ýÀÚ ¿¬»ê awkÀÇ »ê¼ú ¿¬»êÀÌ bcÀÇ »ê¼ú ¿¬»ê°ú ´Ù¸¥ Á¡Àº awk´Â ÀÔ·Â È­ÀÏ ³»ÀÇ ¶óÀÎ Áß ÀϺθ¦ ¼±ÅÃÇÏ´Â ÆÐÅÏ ºÎºÐÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î awkÀÇ ³»Àå ÇÔ¼öÀÎ length´Â ¹®ÀÚ¿­·Î Ãë±ÞµÇ´Â ÀÔ·Â ÇʵåÀÇ ±æÀ̸¦ ¹ôȯÇÏ¸ç ¼ýÀÚ º¯¼ö´Â ¼ýÀÚ·Î Ãë±ÞµÇ´Â ÇʵåÀÇ °ªÀ» ÇÒ´ç¹ÞÀ» ¼ö ÀÖ´Ù. # vi awk.prog7 { s += $2 print $2, "length=" length($2), "s=" s } # awk -f awk.prog7 in.file --> ¼ýÀÚ·Î º¯È¯µÉ¼ö ¾ø´Â ¹®ÀÚ¿­Àº °ªÀÌ 0ÀÌ µÈ´Ù. goodbye length=7 s=0 ¹®ÀÚ¿­ thirty°¡ ±× ¿¹·Î¼­, ¼ýÀÚ·Î º¯È¯µÉ¼ö ¾ø´Ù. ±×·¯³ª ¹®ÀÚ¿­ 222 length=3 s=222 222´Â ¼ýÀÚ·Î ¿Ã¹Ù¸£°Ô º¯È¯µÇ¾ú´Ù. ¶ÇÇÑ s=0°ú °°Àº Çü½ÄÀ¸·Î º¯¼ö¿¡ forth length=5 s=222 °ªÀ» ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº awkº¯¼öÀÇ ¿ç¹Ù¸¥ ¿¹ÀÌ´Ù. s S SS S1 qwerty[42] º¯¼ö¸¦ »ç¿ëÇϱâ Àü¿¡ ¼±¾ðÇϰųª ÃʱâÈ­½Ãų ÇÊ¿ä´Â ¾ø´Ù. awk°¡ ÀÚüÀûÀ¸·Î º¯¼ö¸¦ ÃʱâÈ­½ÃÅ°¸ç ÇÊ¿ä¿¡ µû¶ó ±× º¯¼ö¸¦ ¹®ÀÚ¿­À̳ª ¼ýÀÚ¸¦ ±â¾ï½Ãų¼ö ÀÖ´Ù. # vi awk.prog8 /hello/ { SSS=34 print "SSS is", SSS SSS=hello print "SSS is", SSS } # awk -f awk.prog8 in.file --> ÀÌ¿Í °°Àº ÀÚµ¿ÀûÀÎ º¯¼ö Çü½Ä º¯È¯Àº º¯¼öÀÇ »ç¿ëÀ» ¼ö¿ùÇÏ°Ô ÇÑ´Ù. SSS is 34 SSS is hello o 󸮸¦ ½ÃÀÛÇÏ°í ³¡³»±â À§ÇÑ Æ¯¼ö ÆÐÅÏ Á¤±Ô½Ä ÆÐÅÏ ¿Ü¿¡µµ 2°³ÀÇ Æ¯¼ö ÆÐÅÏÀ¸·Î BEGIN°ú END°¡ »ç¿ëµÈ´Ù. BEGINÀº ù ¹ø° ÀÔ·Â ¶óÀÎÀ» Àбâ Àü¿¡ awkÇÁ·Î±×·¥ÀÇ ¼±µÎ¿¡¼­ ½ÇÇàµÇ¸ç END´Â ¸¶Áö¸· ÀÔ·Â ¶óÀÎÀÌ Ã³¸®µÈ ÈÄ ÇÁ·Î±×·¥ÀÇ Á¦ÀÏ ³¡¿¡¼­ ½ÇÇàµÈ´Ù. BEGINÀº ÁÖ·Î º¯¼ö ÃʱâÈ­ µîÀÇ ÀÛ¾÷¿¡ »ç¿ëµÇ¸ç END´Â ¸¶Áö¸· °è»êÀ» ÇÏ°í Ãâ·ÂÀ» ¿ä¾àÇÏ´Â ÀÛ¾÷¿¡ »ç¿ëµÈ´Ù. BEGINÀ̳ª END°¡ ¾ø¾îµµ µÇ³ª ÇÊ¿äÇÑ °æ¿ì Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ ÇÁ·Î±×·¥Àº ¿©·¯ °³ ¼ýÀÚÀÇ Æò±Õ°ªÀ» Ãâ·ÂÇÑ´Ù. BEGIN { print "Beginning to process the input data ..." } { s += $1 n++ } END { print "mean of these",n,"data items is", s/n } ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ®ÇÏ´Â BEGIN°ú °ü·ÃµÈ ¿¬»êÀº ÇÁ·Î±×·¥ÀÇ ¼±µÎ¿¡¼­ ½ÇÇàµÇ¸ç ±× ÈÄ¿¡ °¢ ÀԷ¶óÀÎÀÌ ÀÐÇôÁø´Ù. ÆÐÅÏÀÌ »ý·«µÇ¾ú±â ¶§¹®¿¡ ¸ðµç ÀÔ·Â ¶óÀο¡ ´ëÇØ ¿¬»êÀÌ ½ÇÇàµÇ¾ú´Ù. ù ¹ø° Çʵ带 º¯¼ö s¿¡ ´õÇÏ°í 1À» Áõ°¡½ÃÅ°¸ç ¸¶Áö¸·ÀÇ ENDÆÐÅÏÀº ¸ðµç ÀÔ·ÂÀÌ Ã³¸®µÈ ÈÄ ½ÇÇàµÈ´Ù. ÀÌ END ÆÐÅÏ¿¡¼­´Â °è»êÀÇ ÃÖÁ¾ °á°ú¸¦ Ãâ·ÂÇÏ°í ÀÖ´Ù. ¿øº»: awk »ç¿ë¹ý[By ÀÌÁø¼ö] | ½© ÇÁ·Î±×·¡¹Ö