¿ø¹®:http://www.linuxnewbie.org/nhf/intel/programming/text_processing_pipes.html

ÀúÀÚ: Adrian J. Chung

³¯Â¥: ?

Á¦¸ñ:ÅؽºÆ® ÇÁ·Î¼¼½Ì ÆÄÀÌÇÁ ¶óÀÎÀ¸·Î ÇÒ ¼ö ÀÖ´Â Àϵé
 

¸í·É ¶óÀÎÀÌ »ç¿ëÇϱ⿡ ºÒÆíÇÑ °ÍÀº »ç½ÇÀÌÁö¸¸, ÀÏ´Ü ¸í·É ¶óÀÎ »ç¿ë¹ýÀ» ¸¶½ºÅÍÇÏ¸é ±×·¡ÇÈ À¯Àú ÀÎÅÍÆäÀ̽º ÇÏ¿¡¼­´Â ¾ËÁö ¸øÇß´ø UnixÀÇ °­·ÂÇÑ ÈûÀ» ¾ò°Ô µÈ´Ù. ÀÌ ±ÛÀº ÀϹÝÀûÀÎ GNU À¯Æ¿¸®Æ¼µéÀ» ÀÌ¿ëÇؼ­ ¸î °¡ÁöÀÇ »ó´çÈ÷ Çغ¼ ¸¸ÇÑ ÀÛ¾÷À» ¼öÇàÇس»´Â ÅؽºÆ® ÇÁ·Î¼¼½Ì ÆÄÀÌÇÁ ¶óÀÎÀ» ±¸¼ºÇÏ´Â ¹ý¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» ´Ù·é´Ù.

¸¹ÀÌ »ç¿ëµÇ´Â ´Ü¾î ¼øÀ§ ¾Ë¾Æ³»±â

°¡Á¤Çϱ⸦, ¾î¶² »ç¶÷ÀÌ ÀÌ ±Ûó·³ ÀÎÅͳݿ¡¼­ ´Ù¿î·ÎµåÇÑ ÅؽºÆ® ÆÄÀÏ¿¡¼­ ´Ü¾îÀÇ ¾²ÀÓ»õ°¡ ¾î¶²Áö¿¡ °ü½ÉÀÌ ÀÖ´Ù°í ÇÏÀÚ. ¾Æ¸¶µµ ±× »ç¶÷Àº ¼Ò½º Äڵ忡¼­ÀÇ º¯¼ö À̸§À̳ª ¾²·¹±â ÆÄÀÏÀÇ ÀÓÀÇÀÇ ºñÆ®µé °°Àº ¸ðµç ºñ´Ü¾î¸¦ ¹«½ÃÇßÀ» ¶§ ¾î¶² ´Ü¾î°¡ °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â Áö°¡ ±Ã±ÝÇÒ °ÍÀÌ´Ù. ÀÚÁÖ »ç¿ëµÇ´Â ´Ü¾îÀÇ ¼øÀ§°¡ ÇÊ¿äÇÒ Áöµµ ¸ð¸¥´Ù. ƯÁ¤ ´Ü¾î¸¦ Ä«¿îÆ®ÇÏ´Â ÇÁ·Î±×·¥À» Perl·Î ÀÛ¼ºÇØ¾ß µÉ °ÍÀΰ¡? ¿©±â ¸î °¡ÁöÀÇ GNU ÅؽºÆ® À¯Æ¿¸®Æ¼¿Í ¹æ´ëÇÑ ÀÚ·áÀÎ /usr/dict/wordsÀÇ µµ¿ò¸¸À¸·Î ÀÌ ¸ñÀûÀ» ´Þ¼ºÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¼Ò°³µÈ´Ù.

¿ì¼± ¿ì¸®´Â ÅؽºÆ® ÆÄÀÏ ¾È¿¡ ÀÖ´Â ¹®ÀåÀ» ³ª´²¼­ ÇÑ ¶óÀο¡ ÇÑ °³ÀÇ ´Ü¾î¸¸ÀÌ ÀÖ°Ô ÇÏ´Â °ÍÀ¸·Î ½ÃÀÛÇÑ´Ù. ÀÌ ¶§¿¡´Â "tr" µµ±¸°¡ À¯¿ëÇÏ´Ù. ÀÌ µµ±¸´Â ÆÄÀϵéÀ» Çѹø¿¡ ÇϳªÀÇ ¹®ÀÚ·Î ¹ø¿ªÇÑ´Ù. ¿©±â¿¡ "tr"À» ÀÌ¿ëÇÏ´Â ÇÙ½ÉÀûÀÎ USENET µµ±¸ rot13¸¦ ¿¹·Î µé¾îº¸ÀÚ:

% tr a-zA-Z n-za-mN-ZA-M < rot13-encrypted.txt

µÎ °³ÀÇ ÀÎÀÚ´Â »ç¿ëÇÏ°íÀÚ ÇÏ´Â ¹®ÀÚ ¹ø¿ª Å×À̺íÀ» ¸í½ÃÇÏ°í ÀÖ´Ù:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM

óÀ½ ¶óÀο¡ ÀÖ´Â ¹®ÀÚµéÀº ±×¿¡ ÇØ´çÇÏ´Â µÎ ¹ø° ¶óÀο¡ ÀÖ´Â ¹®ÀÚ·Î ¹Ù²î¾îÁø´Ù. ÀÏÄ¡ÇÏÁö ¾Ê´Â ¹®ÀÚµéÀº ¿µÇâ ¹ÞÁö ¾Ê´Â´Ù. "tr"Àº ÀÌ¿Í´Â ¹Ý´ë·Î ÇൿÇÏ°Ôµµ ÇØ ÁØ´Ù. Áï, ¿ÀÁ÷ ÀÏÄ¡ÇÏÁö ¾Ê´Â ¹®Àڵ鸸 ¹Ù²Ü ¼öµµ ÀÖ´Ù:

% tr -c a-zA-Z '\n' < article.txt

¹®ÀÚ°¡ ¾Æ´Ñ ¸ðµç °ÍÀº °³Çà ¹®ÀÚ·Î ¹Ù²ï´Ù. ÀÌ·¸°Ô Çϸé ÇÑ ÁÙ¿¡ ÇÑ ´Ü¾î¾¿ ¿À°Ô Çϴ ù¹ø° ´Ü°è°¡ ¿Ï¼ºµÈ´Ù.

´ÙÀ½¿£ À¯»çÇÑ ´Ü¾î¸¦ ÇÔ²² ¹­À» ÇÊ¿ä°¡ ÀÖ´Ù. ÆÄÀÏÀÇ ¶óÀεéÀ» Á¤·ÄÇÏ´Â Á¤µµ¸é ÃæºÐÇÏ´Ù. "sort" ¸í·É ¿ª½Ã ÇÊÅÍ·Î ¾µ ¼ö ÀÖÀ¸¸ç, "-f" ¿É¼ÇÀ» »ç¿ëÇÏ¸é ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê°Ô µÈ´Ù. ±×·¡¼­ ¿ì¸®°¡ »ç¿ëÇÏ°Ô µÉ ÆÄÀÌÇÁ ¶óÀÎÀº ´ÙÀ½°ú °°´Ù:

% tr -c a-zA-Z '\n' < article.txt | sort -f

¿©·¯ºÐÀÌ Áö±Ý Àаí ÀÖ´Â ÀÌ ±Û°ú °°Àº ÅؽºÆ®ÀÇ º»¹®¿¡´Â ¸¹Àº ºñ´Ü¾îµé(¿¹¸¦ µé¸é, "za","tr", "txt")ÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ¿ì¸®´Â /usr/dict/words °°Àº À¯È¿ÇÑ ´Ü¾îµéÀÇ ¸®½ºÆ®¸¦ ÂüÁ¶ÇÔÀ¸·Î½á ÀÌ·± °ÍµéÀ» Á¦°ÅÇÒ ¼ö ÀÖ´Ù. "join" ¸í·ÉÀº µ¥ÀÌÅͺ£À̽º ¿ë¾î·Î ¾Ë·ÁÁø °Íó·³ ÀÚ¿¬½º·¯¿î °áÇÕÀ» ¼öÇàÇÑ´Ù. ÀÌ ¸í·ÉÀº µÎ °³ÀÇ ÅؽºÆ® ½ºÆ®¸²À» ÀÐ¾î µéÀδÙ. ÀÌ ¶§ µÎ °³ÀÇ ÅؽºÆ®´Â Å° Çʵ忡 ÀÇÇØ ¹Ì¸® Á¤·ÄµÇ¾î ÀÖ¾î¾ß¸¸ ÇÏ°í ¾çÂÊ ½ºÆ®¸²À¸·ÎºÎÅÍ µé¾î¿À´Â ¶óÀεéÀ» ÀÏÄ¡½ÃÅ°´Â µ¥¿¡ Å° Çʵ尡 »ç¿ëµÈ´Ù. /usr/dict/words´Â ÀÌ¹Ì ÀúÀåµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ°ÍÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÀÌ»óÀûÀÌ´Ù. ´Ù¸¥ ÅؽºÆ® ½ºÆ®¸² ¾È¿¡ ÀÏÄ¡Çϴ ¦ÀÌ ¾ø´Â ÇàÀÇ µ¥ÀÌÅÍÀÇ °æ¿ì¿¡´Â Ãâ·ÂÀÌ ¾ø´Â °ÍÀÌ ÀÚ¿¬½º·¯¿î °áÇÕÀÇ À¯¿ëÇÑ Á¡ÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ ¿ì¸®ÀÇ »çÀü ¾È¿¡ ÀÖÁö ¾ÊÀº ¸ðµç ´Ü¾îµéÀº Á¦°ÅµÈ´Ù:

% tr -c a-zA-Z '\n' < article.txt | sort -f | join -i /usr/dict/words -

"-"´Â "join"¿¡°Ô µÎ ¹ø° ÅؽºÆ® ½ºÆ®¸²À» Ç¥ÁØ ÀÔ·ÂÀ¸·ÎºÎÅÍ ¹Þ¾ÆµéÀ̶ó°í ¾Ë·ÁÁØ´Ù(Áï, ÆÄÀÌÇÁ ¶óÀÎÀÇ ¾Õ¼± ´Ü°è¿¡¼­ ³ª¿À´Â Ãâ·Â). "-i"´Â joinÀÌ ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.

´ÙÀ½ ´Ü°è´Â ±×·ì Áö¾îÁø ´Ü¾î¸¦ ¼¼´Â °ÍÀε¥ ÀÌ ÀÛ¾÷À» À§Çؼ­ ¿ì¸®´Â "uniq" À¯Æ¿¸®Æ¼¸¦ ¾µ ¼ö ÀÖ´Ù. "uniq"´Â ¿¬¼ÓÀûÀ¸·Î À§Ä¡ÇÑ ¹Ýº¹µÇ´Â ¶óÀεéÀ» Á¦°ÅÇÑ´Ù. "-c" ¿É¼ÇÀ» »ç¿ëÇϸé "uniq"´Â °³ °³ÀÇ À¯ÀÏÇÑ ¶óÀο¡ ´ëÇؼ­ ÀÌ¿Í ºñ½ÁÇÑ ¶óÀÎÀÇ ¼ö¸¦ Ãâ·ÂÇÑ´Ù. ¾Õ¼± °æ¿ì¿Í ¸¶Âù°¡Áö·Î "-i"´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾Ê°Ô ÇÑ´Ù:

% tr -c a-zA-Z '\n' < article.txt | sort -f | join -i /usr/dict/words - | uniq -i -c

¸¶Áö¸·À¸·Î, ÀÌ Ãâ·Â °á°ú´Â "sort" ¸í·ÉÀ» ÀÌ¿ëÇؼ­ Á¤·ÄÇÒ ÇÊ¿ä°¡ ÀÖ´Ù:

% tr -c a-zA-Z '\n' < article.txt | sort -f | join -i /usr/dict/words - | uniq -i -c | sort -r

ÀϹÝÀûÀ¸·Î ASCII ¹®ÀÚ¿­ º¸´Ù ¼öÄ¡ °ª¿¡ ÀÇÇØ Á¤·ÄÀ» ÇÒ ¶§´Â "-n" ¿É¼ÇÀÌ ÁÖ¾îÁ®¾ß ÇÑ´Ù. ¿©±â¼­´Â "uniq" ¸í·ÉÀÌ °³º° ´Ü¾î¿¡ ´ëÇÑ ÃÑ °³¼ö¸¦ °è»êÇ߱⠶§¹®¿¡ »ç¿ëÇÏÁö ¾Ê¾Ò´Ù. °¡Àå ºó¹øÈ÷ »ç¿ëµÇ´Â ´Ü¾î°¡ ¸Ç óÀ½¿¡ ³ª¿À°Ô Çϱâ À§Çؼ­ Á¤·Ä ¼ø¼­¸¦ °Å²Ù·Î ÇÏ´Â "-r"À» »ç¿ëÇß´Ù.

ÀÌ ¹æ¹ý¿¡´Â Ãà¾à¾î¸¦ ´Ù·ç´Â °æ¿ì(¿¹¸¦ µé¸é, "we'll", "it's", "can't")¿Í °°Àº ¸î °¡Áö ´ÜÁ¡ÀÌ ÀÖ±â´Â ÇÏÁö¸¸ ÀÌ·± ´ÜÁ¡Àº ´Ü¾î¸¦ Ä«¿îÆ®Çϱâ À§ÇØ Æ¯º°È÷ ÀÛ¼ºµÈ ÇÁ·Î±×·¥¿¡¼­µµ ¿¹»óµÇ´Â °ÍÀÌ´Ù.

¼ø¼­´ë·Î Á¤·ÄµÇÁö ¾ÊÀº ÆÄÀϵéÀ» °áÇÕÇϱâ

¾î¶² °æ¿ì¿¡´Â µÎ °³ÀÇ ÆÄÀÏÀÌ °³º°ÀûÀ¸·Î °¡Áö°í ÀÖ´Â Á¤º¸¸¦ ÇϳªÀÇ ÆÄÀÏ·Î ÇÕÃÄ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§µµ ÀÖ´Ù. ÀÌ ¶§, µÎ ÆÄÀÏÀ» °áÇÕÇؼ­ ¾òÀº Á¤º¸°¡ ÇÕÄ¡±â ÀÌÀüÀÇ Á¤º¸¿Í °°¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ÀÇ µÎ °³ÀÇ ÆÄÀÏÀ» °¡Áö°í ÀÖ´Ù°í ÇÏÀÚ:

alpha.txt

tetex-xdvi 1.0.6-11
ElectricFence 2.1-3
newt-devel 0.50.8-2
rgrep 0.98.7-5
dosfstools 2.2-4
bdflush 1.5-11
bin86 0.4-7
gnuplot 3.7.1-3
dialog 0.6-16
kernel-utils 2.2.14-5.0
termcap 10.2.7-9

beta.txt

ElectricFence 36903
bdflush 8861
bin86 74968
dialog 85955
dosfstools 106819
gnuplot 1345702
kernel-utils 292693
newt-devel 144815
rgrep 15202
termcap 625272
tetex-xdvi 1222425

ÀÚ¿¬½º·´°Ô "join" ¸í·ÉÀ» »ç¿ëÇÒ °ÍÀ» »ý°¢ÇÏ°Ô µÈ´Ù. ÇÏÁö¸¸ alapha.txt ÆÄÀÏ¿¡¼­ Á¤·ÄµÈ °Í°ú °°Àº ¼ø¼­¸¦ Áöų ÇÊ¿ä°¡ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. Å° Çʵ尡 ÀúÀåµÇÁö ¾ÊÀ¸¸é "join" ¸í·ÉÀ¸·Î´Â ±×·¸°Ô ÇÒ ¼ö ¾ø´Ù. ¿ø·¡ ÆÄÀÏÀÇ ¼ø¼­¸¦ ÀúÀåÇϵµ·Ï µµ¿ï ¼ö ÀÖ´Â º°µµÀÇ Àε¦½Ì Çʵ带 ù¹ø° ÆÄÀÏ¿¡ ´õÇØ¾ß ÇÒ ÇÊ¿ä°¡ »ý±ä´Ù. ÀÌ·± ¶§¿¡ "nl" ¸í·ÉÀ» À¯¿ëÇÏ°Ô ½á ¸ÔÀ» ¼ö ÀÖ´Ù:

% nl alpha.txt

1 tetex-xdvi 1.0.6-11
2 ElectricFence 2.1-3
3 newt-devel 0.50.8-2
4 rgrep 0.98.7-5
5 dosfstools 2.2-4
6 bdflush 1.5-11
7 bin86 0.4-7
8 gnuplot 3.7.1-3
9 dialog 0.6-16
10 kernel-utils 2.2.14-5.0
11 termcap 10.2.7-9

ÀÌÁ¦ ¿ì¸®´Â Å° Çʵ忡 ÀÇÇØ Á¤·ÄÀ» Çؼ­ joinÀ» ¼öÇàÇÑ´Ù. ±×·± ´ÙÀ½¿¡ ¿ø·¡ÀÇ ¼ø¼­¸¦ ³ªÅ¸³»´Â À妽º Çʵ带 °¡Áö°í ´Ù½Ã Á¤·ÄÇÑ´Ù:

% nl alpha.txt |sort +1 |join -j2 2 beta.txt -

"-j2 2" ÀÎÀÚ´Â "join"ÀÌ µÎ ¹ø° Çʵ带 µÎ ¹ø° ÀÔ·Â ½ºÆ®¸²ÀÇ Å° Çʵå·Î »ç¿ëÇϵµ·Ï ¾Ë·ÁÁØ´Ù(beta.txt´Â ù¹ø° ÀÔ·Â ½ºÆ®¸²ÀÌ´Ù). Ãâ·Â °á°ú´Â ¾à°£Àº º¹ÀâÇÏ°ÚÁö¸¸ Á¤·ÄÇÏ´Â µ¥ »ç¿ëµÈ À妽º°¡ ¼¼ ¹ø° Çʵå¶õ °ÍÀ» º¼ ¼ö ÀÖ´Ù. "sort +2"´Â ÇàÀ» ºñ±³ÇÒ ¶§ óÀ½ÀÇ µÎ °³ Çʵ带 °Ç³Ê ¶Ù°Ô ÇÑ´Ù:

% nl alpha.txt |sort +1 |join -j2 2 beta.txt - |sort +2 -n

ÀÌÁ¦ "cut" ¸í·ÉÀ» ÀÌ¿ëÇؼ­ ¼ø¼­¸¦ ³ªÅ¸³»´Â Çʵ带 Á¦°ÅÇÑ´Ù:

% nl alpha.txt |sort +1 |join -j2 2 beta.txt -| sort +2 -n | cut -f 1,2,4 -d " "

"-f" ÀÎÀÚ´Â Ãâ·Â¿¡ Æ÷ÇԵǴ ÇʵåÀÇ ¸®½ºÆ®¸¦ ³Ñ°ÜÁØ´Ù. "cut"Àº ÀϹÝÀûÀ¸·Î ÇÊµå ±¸ºÐÀÚ·Î [TAB]À» »ç¿ëÇÏÁö¸¸ "-d"¸¦ »ç¿ëÇؼ­ º¯°æÇÒ ¼ö ÀÖ´Ù. ¶Ç Ãâ·Â °á°ú°¡ ¿¹»Ú°Ô ³ª¿À·Á¸é Ãâ·Â Çü½Ä ÁöÁ¤ÀÌ ÇÊ¿äÇÏ´Ù. ¿©±â¼­´Â "pr" µµ±¸¸¦ »ç¿ëÇß´Ù:

% nl alpha.txt |sort +1 |join -j2 2 beta.txt -| sort +2 -n | cut -f 1,2,4 -d " " |pr -e\ 16 -T

tetex-xdvi 1222425 1.0.6-11
ElectricFence 36903 2.1-3
newt-devel 144815 0.50.8-2
rgrep 15202 0.98.7-5
dosfstools 106819 2.2-4
bdflush 8861 1.5-11
bin86 74968 0.4-7
gnuplot 1345702 3.7.1-3
dialog 85955 0.6-16
kernel-utils 292693 2.2.14-5.0
termcap 625272 10.2.7-9

"pr"Àº ´ë°³ ¶óÀÎ ÇÁ¸°ÅÍÀÇ Ãâ·Â Çü½ÄÀ» ÁöÁ¤ÇÑ´Ù. ÀÌÁ¦´Â ÀÌ·± ¿À·¡µÈ Çϵå¿þ¾î¸¦ »ç¿ëÇÏ´Â »ç¶÷ÀÌ °ÅÀÇ ¾øÁö¸¸ "pr" ¸í·ÉÀº ¿©ÀüÈ÷ »ç¿ëµÇ°í ÀÖ´Ù. "-e"´Â TAB ¹®ÀÚ¸¦ ½ºÆäÀ̽º·Î ´ëüÇÑ´Ù. ¿ì¸®°¡ À§¿¡¼­ »ç¿ëÇÑ "-e" ÀÎÀÚ´Â "pr"ÀÌ TAB ¹®ÀÚ·Î ÇϳªÀÇ ½ºÆäÀ̽º¸¦ »ç¿ëÇÏ°í ÅÇ À§Ä¡¸¦ 16 ¹®ÀÚ ³Êºñ·Î °£°ÝÀ» µÎ°Ô ÇÑ´Ù. "-T"´Â ¸Ó¸®¸», ²¿¸®¸», Æû Çǵ带 Ãâ·ÂÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.

°á·Ð

GNU ÅؽºÆ® ÇÁ·Î¼¼½Ì À¯Æ¿¸®Æ¼°¡ Á¦°øÇÏ´Â ±â´ÉµéÀº ¸í·É ¶óÀÎÀ» ÀÌ¿ëÇؼ­ ¿©·¯ °¡ÁöÀÇ °¢±â ´Ù¸¥ ¸¹Àº ¹æ½ÄÀ¸·Î °áÇÕÇÏ¿© À̵é À¯Æ¿¸®Æ¼°¡ ¾Æ´Ï¾úÀ¸¸é Ưº°ÇÑ ÇÁ·Î±×·¥ÀÌ ÀÛ¼ºµÇ¾î¾ß¸¸ ÇßÀ» ÀÛ¾÷µéÀ» ¼öÇàÇس½´Ù.  ¸í·É ¶óÀÎ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ÀÍÈ÷´Â µ¥¿¡ ÀûÀº ½Ã°£À» ÅõÀÚÇÔÀ¸·Î½á °á±¹¿¡´Â ¸¹Àº ¹®Á¦Á¡À» ÇØ°áÇÒ ¼ö ÀÖ´Ù.