shell编程基础(4)

来源:互联网 发布:算法交易模型 编辑:程序博客网 时间:2024/05/12 10:41
举例:awk '/^begin/ { N=0 #在找到开始标志begin时,将变量N置0 while (getline && $0 !~ /^end/) #取下一行,并且下一行不是end时 { f[++N]=$0 } #将读入的数据存入数组f中 for (i=1;i<=N;i++) #对begin与end之间的数据进行处理(已 { printf("%s " , f) } #存入到数组f中。 print "" #换行 }' data getline函数还有其它用法:getline x #将下一个记录读入变量x中,不作分解,不设置NFgetline < “filename” #从指定文件filename中读取一行(存入$0中),而不是从当前文件中,对NR或FNR没有影响,但对字段进行分解并且设置NF。再或者,如上页例题中所示,通过管道截取命令执行后的结果。第六章 自定义函数(User-defined Functions) 复杂的 awk 程序常常要通过自定义函数来简化。自定义的函数的使用与内部函数的使用方法一样。 1) 函数定义的格式 函数的定义可以放在 awk 程序的任何地方。 一个自定义的函数其格式如下: function name (parameter-list) { body-of-function } name 是所定义的函数的名称。一个正确的函数名称可包括一序列的字母、数字、下标线 (underscores),但是不能用数字做开头。 parameter-list 是函数的参数列表(argument),各个参数之间以逗点隔开。body-of-function 包含 awk 的描述 (statement)。它是函数定义里最重要的部份,它决定函数实际要做何种事。 2) 函数定义的例子 下面这个例子,会将每个记录的第一个字段值的平方与第二个字段之值的平方加起来。 awk ‘{ print $1,$2,"sum =",SquareSum($1,$2) } function SquareSum(x,y) { sum=x*x+y*y return sum }’ filename 在定义了函数SquareSum之后,对每一行数据的处理只需经过一次调用就可以。但定义自定义函数最大的好处还是可以在不同的地方调用,而不必每次都写上一堆,此外还使程序结构清楚,易读,易维护。第七章 示例 awk '{ if (NF > max) max = NF } END { print max }' filename 此程序会输出所有输入行中,包含字段最多的行的字段数。 awk 'length($0) > 80' filename 此程序会输出一行超过 80 个字符的每一行。此处只有 pattern 被列出,action 是采用缺省的 print。 awk 'NF > 0' filename 对于拥有至少一个字段的所有行,此程序皆会输出。这是一个简单的方法,将一个文件里的所有空白行删除。 awk '{if (NF > 0) print}' filename 对于拥有至少一个字段的所有行,此程序皆会输出。这是一个简单的方法,将一个文件里的所有空白行删除。 awk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }' filename 此程序会输出 0 到 100 之间的 7 个乱数值。ls -l files| awk 'BEGIN { x=0 } { x += $4 } END { print "total bytes: " x }' filename 此程序会输出所有指定的文件之bytes数目的总和。 expand file | awk '{if (x < length()) x = length()} END {print "maximum line length is " x}' filename 此程序会将指定文件里最长一行的长度输出。expand 会将 tab 改成 space,所以是用实际的右边界来做长度的比较。 awk 'BEGIN {FS = ":"} {print $1 | "sort"}' /etc/passwd 此程序会将所有用户的login名称,依照字母的顺序输出。 awk '{nlines++} END {print nlines}' filename 此程序会将一个文件的总行数输出。 awk 'END {print NR}' filename 此程序也会将一个文件的总行数输出,但是计算行数的工作由awk来做。 awk '{print NR,$0}' filename在输出文件的内容时,会在每行的最前面输出行号,它的功能与 'cat -n' 类似。 $ awk '/^(no|so)/' test-----打印所有以模式no或so开头的行。$ awk '/^[ns]/{print $1}' test-----如果记录以n或s开头,就打印这个记录。$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一个域以两个数字结束就打印这个记录。$ awk '$1 == 100 || $2 < 50' test-----如果第一个或等于100或者第二个域小于50,则打印该行。$ awk '$1 != 10' test-----如果第一个域不等于10就打印该行。$ awk '/test/{print $1 + 10}' test-----如果记录包含正则表达式test,则第一个域加10并打印出来。$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。$ awk '/^root/,/^mysql/' test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。
原创粉丝点击