awk 命令使用入门基础详解(3)

\Y 匹配一个单词开头或者末尾的空字符串。 \B 匹配单词内的空字符串。 \< 匹配一个单词的开头的空字符串,锚定开始。 \> 匹配一个单词的末尾的空字符串,锚定末尾。 \w 匹配一个字母数字组成的单词。 \W 匹配一个非字母数字组成的单词。 \‘ 匹配字符串开头的一个空字符串。 \' 匹配字符串末尾的一个空字符串

8. POSIX字符集 9. 匹配操作符(~)

用来在记录或者域内匹配正则表达式。

$ awk '$1 ~/^root/' test #将显示test文件第一列中以root开头的行。

  10. 比较表达式

conditional expression1 ? expression2: expression3

例如:

$ awk '$1 > $3 ? max=$1: max=$3 {print max}' test #如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。 $ awk '$1 + $2 > 100' test #如果第一和第二个域相加大于100,则打印这些行。 $ awk '$1 > 5 && $2 < 10' test #如果第一个域大于5,并且第二个域小于10,则打印这些行。

11. 范围模板

范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。

$ awk '/root/,/mysql/' test #将显示root第一次出现到mysql第一次出现之间的所有行。

12. 一个验证passwd文件有效性的例子

$ cat /etc/passwd | awk -F: '\ NF != 7{\ printf("line %d,does not have 7 fields:%s\n",NR,$0)}\ $1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\$2 == "*" {printf("line %d, no password: %s\n",NR,$0)}'

 

cat把结果输出给awk,awk把域之间的分隔符设为冒号。

 

 

如果域的数量(NF)不等于7,就执行下面的程序。

 

 

printf打印字符串"line ?? does not have 7 fields",并显示该条记录。

 

 

如果第一个域没有包含任何字母和数字,printf打印“no alpha and numeric user id" ,并显示记录数和记录。

 

 

如果第二个域是一个星号,就打印字符串“no passwd”,紧跟着显示记录数和记录本身。

 
13. 几个实例

$ 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开头的记录为止,或到文件末尾。

14. awk编程 14.1. 变量

在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串。

赋值格式:Variable = expression,例如:

$ awk '$1 ~/test/{count = $2 + $3; print count}' test # 如果第一个域匹配test,就把第二和第三个域的值相加,并把结果赋值给变量count,最后打印出来。

awk可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。例如:

$ awk -F: -f awkscript month=4 year=2004 test #为自定义变量month和year分别赋值为42004。这些变量在awkscript脚本中使用起来就象是在脚本中建立的一样。注意,如果参数前面出现test,那么在BEGIN语句中的变量就不能被使用。

域变量也可被赋值和修改,例如:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11866.html