📄 awk.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><TITLE>Awk</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINKREL="HOME"TITLE="Advanced Bash-Scripting Guide"HREF="index.html"><LINKREL="UP"TITLE="A Sed and Awk Micro-Primer"HREF="sedawk.html"><LINKREL="PREVIOUS"TITLE="A Sed and Awk Micro-Primer"HREF="sedawk.html"><LINKREL="NEXT"TITLE="Exit Codes With Special Meanings"HREF="exitcodes.html"><METAHTTP-EQUIV="Content-Style-Type"CONTENT="text/css"><LINKREL="stylesheet"HREF="common/kde-common.css"TYPE="text/css"><METAHTTP-EQUIV="Content-Type"CONTENT="text/html; charset=iso-8859-1"><METAHTTP-EQUIV="Content-Language"CONTENT="en"><LINKREL="stylesheet"HREF="common/kde-localised.css"TYPE="text/css"TITLE="KDE-English"><LINKREL="stylesheet"HREF="common/kde-default.css"TYPE="text/css"TITLE="KDE-Default"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#AA0000"VLINK="#AA0055"ALINK="#AA0000"STYLE="font-family: sans-serif;"><DIVCLASS="NAVHEADER"><TABLEWIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="sedawk.html">Prev</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">Appendix C. A Sed and Awk Micro-Primer</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="exitcodes.html">Next</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> is a full-featured text processing language with a syntax reminiscent of <BCLASS="COMMAND">C</B>. While it possesses an extensive set of operators and capabilities, we will cover only a couple of these here - the ones most useful for shell scripting.</P><P>Awk breaks each line of input passed to it into <ICLASS="FIRSTTERM">fields</I>. By default, a field is a string of consecutive characters separated by <AHREF="special-chars.html#WHITESPACEREF">whitespace</A>, though there are options for changing the delimiter. Awk parses and operates on each separate field. This makes awk ideal for handling structured text files -- especially tables -- data organized into consistent chunks, such as rows and columns.</P><P>Strong quoting (single quotes) and curly brackets enclose segments of awk code within a shell script.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><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 # Prints field #3 of file $filename to stdout. 10 11 awk '{print $1 $5 $6}' $filename 12 # Prints fields #1, #5, and #6 of file $filename.</PRE></TD></TR></TABLE></P><P>We have just seen the awk <BCLASS="COMMAND">print</B> command in action. The only other feature of awk we need to deal with here is variables. Awk handles variables similarly to shell scripts, though a bit more flexibly.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 { total += ${column_number} }</PRE></TD></TR></TABLE> This adds the value of <ICLASS="EMPHASIS">column_number</I> to the running total of <SPANCLASS="QUOTE">"total"</SPAN>. Finally, to print <SPANCLASS="QUOTE">"total"</SPAN>, there is an <BCLASS="COMMAND">END</B> command block, executed after the script has processed all its input. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 END { print total }</PRE></TD></TR></TABLE></P><P>Corresponding to the <BCLASS="COMMAND">END</B>, there is a <BCLASS="COMMAND">BEGIN</B>, for a code block to be performed before awk starts processing its input.</P><P>The following example illustrates how <BCLASS="COMMAND">awk</B> can add text-parsing tools to a shell script.</P><DIVCLASS="EXAMPLE"><HR><ANAME="LETTERCOUNT2"></A><P><B>Example C-1. Counting Letter Occurrences</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #! /bin/sh 2 # letter-count2.sh: Counting letter occurrences in a text file. 3 # 4 # Script by nyal [nyal@voila.fr]. 5 # Used with permission. 6 # Recommented by document author. 7 # Version 1.1: Modified to work with gawk 3.1.3. 8 # (Will still work with earlier versions.) 9 10 11 INIT_TAB_AWK="" 12 # Parameter to initialize awk script. 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 # For example: ./letter-count2.sh filename.txt a b c 22 exit $E_PARAMERR # Not enough arguments passed to script. 23 } 24 25 if [ ! -f "$1" ] ; then 26 echo "$1: No such file." 2>&1 27 usage # Print usage message and exit. 28 fi 29 30 if [ -z "$2" ] ; then 31 echo "$2: No letters specified." 2>&1 32 usage 33 fi 34 35 shift # Letters specified. 36 for letter in `echo $@` # For each one . . . 37 do 38 INIT_TAB_AWK="$INIT_TAB_AWK tab_search[${count_case}] = \"$letter\"; final_tab[${count_case}] = 0; " 39 # Pass as parameter to awk script below. 40 count_case=`expr $count_case + 1` 41 done 42 43 # DEBUG: 44 # echo $INIT_TAB_AWK; 45 46 cat $FILE_PARSE | 47 # Pipe the target file to the following awk script. 48 49 # ---------------------------------------------------------------------------------- 50 # Earlier version of script used: 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 # Nothing all that complicated, just . . . 63 #+ for-loops, if-tests, and a couple of specialized functions. 64 65 exit $? 66 67 # Compare this script to letter-count.sh.</PRE></TD></TR></TABLE><HR></DIV><P>For simpler examples of awk within shell scripts, see: <OLTYPE="1"><LI><P><AHREF="internal.html#EX44">Example 11-12</A></P></LI><LI><P><AHREF="redircb.html#REDIR4">Example 16-8</A></P></LI><LI><P><AHREF="filearchiv.html#STRIPC">Example 12-29</A></P></LI><LI><P><AHREF="wrapper.html#COLTOTALER">Example 33-5</A></P></LI><LI><P><AHREF="ivr.html#COLTOTALER2">Example 9-23</A></P></LI><LI><P><AHREF="internal.html#COLTOTALER3">Example 11-18</A></P></LI><LI><P><AHREF="procref1.html#PIDID">Example 27-2</A></P></LI><LI><P><AHREF="procref1.html#CONSTAT">Example 27-3</A></P></LI><LI><P><AHREF="loops.html#FILEINFO">Example 10-3</A></P></LI><LI><P><AHREF="extmisc.html#BLOTOUT">Example 12-55</A></P></LI><LI><P><AHREF="randomvar.html#SEEDINGRANDOM">Example 9-28</A></P></LI><LI><P><AHREF="moreadv.html#IDELETE">Example 12-4</A></P></LI><LI><P><AHREF="string-manipulation.html#SUBSTRINGEX">Example 9-13</A></P></LI><LI><P><AHREF="assortedtips.html#SUMPRODUCT">Example 33-16</A></P></LI><LI><P><AHREF="loops.html#USERLIST">Example 10-8</A></P></LI><LI><P><AHREF="wrapper.html#PRASC">Example 33-4</A></P></LI></OL> </P><P>That's all the awk we'll cover here, folks, but there's lots more to learn. See the appropriate references in the <AHREF="biblio.html"><I>Bibliography</I></A>.</P></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLEWIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="sedawk.html">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="exitcodes.html">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">A Sed and Awk Micro-Primer</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="sedawk.html">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Exit Codes With Special Meanings</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -