?? awk.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>Awk</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高級Bash腳本編程指南"HREF="index.html"><LINKREL="UP"TITLE="一個學習Sed和Awk的小手冊"HREF="sedawk.html"><LINKREL="PREVIOUS"TITLE="Sed"HREF="x17814.html"><LINKREL="NEXT"TITLE="帶有特殊含義的退出碼"HREF="exitcodes.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高級Bash腳本編程指南: 一本深入學習shell腳本藝術的書籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="x17814.html"ACCESSKEY="P">前一頁</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">Appendix C. 一個學習Sed和Awk的小手冊</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="exitcodes.html"ACCESSKEY="N">下一頁</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="AWK">C.2. Awk</A></H1><P><ANAME="AWKREF"></A></P><P><BCLASS="COMMAND">Awk</B>是功能完整的文本處理語言, 使用類似于<BCLASS="COMMAND">C</B>的語法. 它具有一整套操作符和能力集, 我們只在這里講解一小部分 - 也就是在shell腳本中最有用的部分. </P><P>Awk將傳遞進來的每行輸入都分割成<ICLASS="FIRSTTERM">域</I>. 默認情況下, 一個域指的就是使用<AHREF="special-chars.html#WHITESPACEREF">空白</A>分隔的一個連續字符串, 不過我們可以修改屬性來改變分隔符. Awk將會分析并操作每個分割域. 因為這種特性, 所以awk非常善于處理結構化的文本文件 -- 尤其是表 -- 將數據組織成統一的塊, 比如說分成行和列. </P><P>強引用(單引號)和大括號用來包含shell腳本中的awk代碼段. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 echo one two | awk '{print $1}' 2 # one 3 4 echo one two | awk '{print $2}' 5 # two 6 7 8 awk '{print $3}' $filename 9 # 打印文件$filename的域#3, 到stdout. 10 11 awk '{print $1 $5 $6}' $filename></FONT></TD></TR></TABLE></P><P>事實上, 上邊我們只講解了awk的<BCLASS="COMMAND">print</B>命令. 我們需要在這里講解awk的另一個特點, 變量. Awk處理變量的手段與shell腳本很相似, 雖然更復雜一些. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 { total += ${column_number} }</PRE></FONT></TD></TR></TABLE> 上邊這句將<EM>column_number</EM>的值加上<SPANCLASS="QUOTE">"total"</SPAN>的值然后再賦給<EM>total</EM>. 最后, 為了打印出<SPANCLASS="QUOTE">"total"</SPAN>, 我們需要一個<BCLASS="COMMAND">END</B>命令塊, 當腳本處理完所有輸入之后, 就會執行這個命令塊中的內容. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 END { print total }</PRE></FONT></TD></TR></TABLE></P><P>與<BCLASS="COMMAND">END</B>對應, 還有<BCLASS="COMMAND">BEGIN</B>命令塊, 在腳本處理所有輸入之前, 將會執行這個命令塊中的內容. </P><P>下面這個例子展示了<BCLASS="COMMAND">awk</B>如何在shell腳本中添加文本分析工具. </P><DIVCLASS="EXAMPLE"><HR><ANAME="LETTERCOUNT2"></A><P><B>例子 C-1. 計算字符出現次數</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #! /bin/sh 2 # letter-count2.sh: 在文本文件中計算字符的出現次數. 3 # 4 # 由nyal [nyal@voila.fr]編寫. 5 # 授權使用. 6 # 本文作者重新注釋. 7 # 版本 1.1: 經過修改可用于gawk 3.1.3. 8 # (也可用于awk的早期版本.) 9 10 11 INIT_TAB_AWK="" 12 # 初始化awk腳本的參數. 13 count_case=0 14 FILE_PARSE=$1 15 16 E_PARAMERR=65 17 18 usage() 19 { 20 echo "Usage: letter-count.sh file letters" 2>&1 21 # 比如: ./letter-count2.sh filename.txt a b c 22 exit $E_PARAMERR # 傳遞到腳本的參數個數不夠. 23 } 24 25 if [ ! -f "$1" ] ; then 26 echo "$1: No such file." 2>&1 27 usage # 打印使用信息并退出. 28 fi 29 30 if [ -z "$2" ] ; then 31 echo "$2: No letters specified." 2>&1 32 usage 33 fi 34 35 shift # 指定的字符. 36 for letter in `echo $@` # for循環遍歷 . . . 37 do 38 INIT_TAB_AWK="$INIT_TAB_AWK tab_search[${count_case}] = \"$letter\"; final_tab[${count_case}] = 0; " 39 # 作為參數傳遞到下邊的awk腳本中. 40 count_case=`expr $count_case + 1` 41 done 42 43 # 調試: 44 # echo $INIT_TAB_AWK; 45 46 cat $FILE_PARSE | 47 # 將目標文件通過管道傳遞下邊的awk腳本中. 48 49 # ---------------------------------------------------------------------------------- 50 # 下邊是本腳本的早期版本使用的方法: 51 # awk -v tab_search=0 -v final_tab=0 -v tab=0 -v nb_letter=0 -v chara=0 -v chara2=0 \ 52 53 awk \ 54 "BEGIN { $INIT_TAB_AWK } \ 55 { split(\$0, tab, \"\"); \ 56 for (chara in tab) \ 57 { for (chara2 in tab_search) \ 58 { if (tab_search[chara2] == tab[chara]) { final_tab[chara2]++ } } } } \ 59 END { for (chara in final_tab) \ 60 { print tab_search[chara] \" => \" final_tab[chara] } }" 61 # ---------------------------------------------------------------------------------- 62 # 不是所有的都那么復雜, 只是 . . . 63 #+ for循環, if條件判斷, 和幾個指定函數而已. 64 65 exit $? 66 67 # 與腳本letter-count.sh相比較.</PRE></FONT></TD></TR></TABLE><HR></DIV><P>如果想再看一些在shell腳本中使用awk的簡單例子, 如下: <P></P><OLTYPE="1"><LI><P><AHREF="internal.html#EX44">例子 11-12</A></P></LI><LI><P><AHREF="redircb.html#REDIR4">例子 16-8</A></P></LI><LI><P><AHREF="filearchiv.html#STRIPC">例子 12-29</A></P></LI><LI><P><AHREF="wrapper.html#COLTOTALER">例子 33-5</A></P></LI><LI><P><AHREF="ivr.html#COLTOTALER2">例子 9-24</A></P></LI><LI><P><AHREF="internal.html#COLTOTALER3">例子 11-19</A></P></LI><LI><P><AHREF="procref1.html#PIDID">例子 27-2</A></P></LI><LI><P><AHREF="procref1.html#CONSTAT">例子 27-3</A></P></LI><LI><P><AHREF="loops1.html#FILEINFO">例子 10-3</A></P></LI><LI><P><AHREF="extmisc.html#BLOTOUT">例子 12-55</A></P></LI><LI><P><AHREF="randomvar.html#SEEDINGRANDOM">例子 9-29</A></P></LI><LI><P><AHREF="moreadv.html#IDELETE">例子 12-4</A></P></LI><LI><P><AHREF="string-manipulation.html#SUBSTRINGEX">例子 9-14</A></P></LI><LI><P><AHREF="assortedtips.html#SUMPRODUCT">例子 33-16</A></P></LI><LI><P><AHREF="loops1.html#USERLIST">例子 10-8</A></P></LI><LI><P><AHREF="wrapper.html#PRASC">例子 33-4</A></P></LI></OL> </P><P>我們在這里所要講解的awk內容就這么多, 但是事實上還有好多東西需要學. 可以參考<AHREF="biblio.html"><I>參考文獻</I></A>中的內容深入學習. </P></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="x17814.html"ACCESSKEY="P">前一頁</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首頁</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="exitcodes.html"ACCESSKEY="N">下一頁</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">Sed</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="sedawk.html"ACCESSKEY="U">上一級</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">帶有特殊含義的退出碼</TD></TR></TABLE></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -