lt 10 test如果第一个域大于 5,并且第二个域小于10,则打印这些行。
11. 范围模板范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。
如果有一个模板没出现,则匹配到开头或末尾。
如 awk /root//mysql/test 将显示 root 第一次出现到 mysql 第一次出现之间的所有行。
12. 一个验证 passwd 文件有效性的例子 cat /etc/passwd awk -F: NF 7printfquotline ddoes not have 7 fields:snquotNR0 1 /A-Za-z0-9/printfquotline dnon alpha and numeric user id:d:snNR0 2 quotquot printfquotline d no password: snquotNR0 cat 把结果输出给 awk,awk 把域之间的分隔符设为冒号。
如果域的数量NF不等于 7,就执行下面的程序。
printf 打印字符串quotline does not have 7 fieldsquot,并显示该条记录。
如果第一个域没有包含任何字母和数字,printf 打印“no alpha and numeric user idquot ,并显示记录数和记录。
如果第二个域是一个星号,就打印字符串“no passwd”,紧跟着显示记录数 和记录本身。
13. 几个实例 awk /noso/ test-----打印所有以模式 no 或 so 开头的行。
awk /ns/print 1 test-----如果记录以 n 或 s 开头,就打印 这个记录。
awk 1 /0-90-9/print 1 test-----如果第一个域以两 个数字结束就打印这个记录。
awk 1 100 2 lt 50 test-----如果第一个或等于 100 或 者第二个域小于 50,则打印该行。
awk 1 10 test-----如果第一个域不等于 10 就打印该行。
awk /test/print 1 10 test-----如果记录包含正则表达式 test,则第一个域加 10 并打印出来。
awk print 1 gt 5 quotok quot1: quoterrorquot1 test-----如果第一 个域大于 5 则打印问号后面的表达式值,否则打印冒号后面的表达式 值。
awk /root//mysql/ test----打印以正则表达式 root 开头的记 录到以正则表达式 mysql 开头的记录范围内的所有记录。
如果找到一 个新的正则表达式 root 开头的记录,则继续打印直到下一个以正则表 达式 mysql 开头的记录为止,或到文件末尾。
14. awk 编程14.1. 变量 在 awk 中,变量不需要定义就可以直接使用,变量类型可以是数字或字 符串。
赋值格式:Variable expression,如 awk 1 /test/count 2 3 print count test上式的作用是awk 先扫描第一个域, 一旦 test 匹配,就把第二个域的值加上第三个域的值,并把结果赋值 给变量 count,最后打印出来。
awk 可以在命令行中给变量赋值,然后将这个变量传输给 awk 脚本。
如 awk -F: -f awkscript month4 year2004 test,上式的 month 和 year 都是自定义变量,分别被赋值为 4 和 2004。
在 awk 脚本中,这些变量使用起来就象是在脚本中建立的一样。
注意,如果 参数前面出现 test,那么在 BEGIN 语句中的变量就不能被使用。
域变量也可被赋值和修改,如 awk 2 100 1 print test 上式表示,如果第二个域不存在,awk 将计算表达式 100 加1 的值, 并将其赋值给2,如果第二个域存在,则用表达式的值覆盖2 原来的 值。
再例如: awk 1 quotrootquot1 quottestquotprint test,如 果第一个域的值是“root”,则把它赋值为“test”,注意,字符串一定要 用双引号。
内建变量的使用。
变量列表在前面已列出,现在举个例子说明一下。
awk -F: IGNORECASE1 1 quotMARYquotprint NR12NFtest,把 IGNORECASE 设为 1 代表忽略大小写, 打印第一个域是 mary 的记录数、第一个域、第二个域和最后一个域。
14.2. BEGIN 模块BEGIN 模块后紧跟着动作块,这个动作块在 awk 处理任何输入文件之前执行。
所以它可以在没有任何输入的情况下进行测试。
它通常用来改变内建变量的值,如 OFS RS 和 FS 等,以及打印标题。
awk BEGINFSquot:quot OFSquottquot 如:ORSquotnnquotprint 123 test。
上式表示,在处理输入文件以前,域分隔符FS被设为冒号,输出文件分隔符OFS被设置为制表符,输出记录分隔符ORS被设置为两个换行符。
awk BEGINprint quotTITLE TESTquot只打印标题。
14.3. END 模块END 不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。
如 awk ENDprint quotThe number of records isquotNR test,上式将打印所有被处理的记录数。
14.4. 重定向和管道 awk 可使用 shell 的重定向符进行重定向输出,如: awk 1 100 print 1 gt quotoutput_filequot test。
上式表示如果第一个域的值等 于 100,则把它输出到 output_file 中。
也可以用gtgt来重定向输出, 但不清空文件,只做追加操作。
输出重定向需用到 getline 函数。
getline 从标准输入、管道或者当前正 在处理的文件之外的其他输入文件获得输入。
它负责从输入获得下一 行的内容,并给 NFNR 和 FNR 等内建变量赋值。
如果得到一条记录, getline 函数返回 1,如果到达文件的末尾就返回 0,如果出现错误, 例如打开文件失败,就返回-1。
如: awk BEGIN quotdatequot getline d print d test。
执行 linux 的 date 命令,并通过管道输出给 getline,然后再把输出赋值给自定义 变量 d,并打印它。
awk BEGINquotdatequot getline d splitdmon print mon2 test。
执行 shell 的 date 命令,并通过管道输出给 getline, 然后 getline 从管道中读取并将输入赋值给 d,split 函数把变量 d 转 化成数组 mon,然后打印数组 mon 的第二个元素。
awk BEGINwhile quotlsquot getline print,命令 ls 的输出传递 给 geline 作为输入,循环使 getline 从 ls 的输出中读取一行,并把它 打印到屏幕。
这里没有输入文件,因为 BEGIN 块在打开输入文件前 执行,所以可以忽略输入文件。
awk BEGINprintf quotWhat is your namequot getline name lt quot/dev/ttyquot 1 name print quotFoundquot name on line quot NR quot.quot ENDprint quotSee youquot name quot.quot test。
在屏幕上打印”What is your namequot并等待用户应答。
当一行输入完毕后,getline 函数从 终端接收该行输入,并把它储存在自定义变量 name 中。
如果第一个 域匹配变量 name 的值,print 函数就被执行,END 块打印 See you 和 name 的值。
awk BEGINwhile getline lt quot/etc/passwdquot gt 0 lc print lc。
awk 将逐行读取文件/etc/passwd 的内容,在到达文件 末尾前,计数器 lc 一直增加,当到末尾时,打印 lc 的值。
注意,如果 文件不存在,getline 返回-1,如果到达文件的末尾就返回 0,如果读 到一行,就返回 1,所以命令 while getline lt quot/etc/passwdquot在 文件不存在的情况下将陷入无限循环,因为返回-1 表示逻辑真。
可以在 awk 中打开一个管道,且同一时刻只能有一个管道存在。
通过 close可关闭管道。
如: awk print 1 2 quotsortquot test END closequotsortquot。
awd 把 print 语句的输出通过管道作为 linux 命令 sort 的输入END 块执行关闭管道操作。
system 函数可以在 awk 中执行 linux 的命令。
如: awk BEGINsystemquotclearquot。
fflush 函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓 冲区,如果以空字符串为参数,如 fflushquotquot则刷新所有文件和管道 的输出缓冲区。
14.5. 条件语句awk 中的条件语句是从 C 语言中借鉴过来的,可控制程序的流程。
14.5.1. if 语句格式: if expression statement statement ... awk if 1 lt2 print 2 quottoo highquot te
上一篇:
网络公司运营方案
下一篇:
关于马克思生态文明理论研究