📄 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 12 # 打印文件$filename的域#1, #5, 和#6. </PRE></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 + -