# awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test //$1大于5打印ok
O.‘模式’是一种表达式
1./(RE)/:加圆括号以确保正确的值。
2.比较表达式中两操作数都是数进行数值比较,否则进行串比较。
3.awk字符类是一种特殊的方括号表达式,此概念来自于POSIX 标准,用于描述具有某种特定属性的字符集合。常用字符类有:
[:alnum:] 字母或数字字符 [:alpha:] 字母字符 [:blank:] 空格或制表符 [:cntrl:] 控制字符 [:digit:] 数字字符 [:lower:] 小写字母字符 | [:graph:] 既能看见又能打印的字符 [:print:] 可打印字符(非控制字符) [:punct:] 标点符号字符 [:space:] 空白字符,包括空格.制表.换页等 [:upper:] 大写字符 [:xdigit:] 十六进制数字字符 |
一.BEGIN|END (特殊模式,与内容无关,只执行1次)
1.BEGIN{action}处理第一条记录之前将BEGIN后面大括号之内的动作运行且只运行一次。BEGIN 通常用来设置变量。
#awk 'BEGIN{var="500"} {if ($3<var) print $0}' /etc/passwd #awk 'BEGIN{RS=""} /root/' /etc/passwd //段落 grep |
通过awk+正则把括弧里的字段取出来,file.txt内容如下: groups=001(group1), 002(group2), 003(group3) #awk 'BEGIN{FS="[()]"}{print $2}' file.txt group1 group2 group3 |
2.END{action}处理完最后一条记录之后将END后面大括号之内的动作运行且只运行一次。可在程序结束后输出一些消息。
#awk 'END {print NR}' passwd | #awk '{nlines++}END {print nlines}' passwd |
#awk '//;END {print "**";print "End"}' /etc/passwd | |
#ls -l files | awk '{x += $5};END {print "total bytes: " x}' 显示出所有文件的总字节数 |
二./RE/与/re1/,/re2/(支持\ ^ $ . [] | () * + ?)
1.匹配单个模式
# awk '/x.*x/' /etc/passwd # awk '/root/ { print }' /etc/passwd # awk '/^(no|so)/' test 打印所有以模式no或so开头的行 # awk '/test/{print $1 + 10}' test 记录包含test,则$1加10并打印 # awk '/^[ns]/{print $1}' test 打印以n或s开头的记录 |
2.匹配模式范围
与其他的搜索不同,范围模式在匹配文本时可跨越不同的记录。它输出包含匹配项部分内容的完整的记录。
#awk '/root/,/mail/' /etc/passwd
三.条件表达式
1.2个匹配运算符:~ ~!
# echo 1|awk '$0 ~/^[0-9]*$/ {print $0 " is a integer"}' 1 is a integer |
# awk '$0 ~/^root/' /etc/passwd |
# ls|awk '$0 ~ /progam[0-9]+\.c/ { print $0 }' 找progam[0-9]+.c的文件 |
# awk '$3 ~/s/' /etc/passwd $3包含s字符的记录 |
# awk 'BEGIN {FS=":"} $7 !~ /bash/ {print $5}' passwd 不是bash的用户全名 # awk 'BEGIN{FS=":";} {if ($3>499) print $1 "@zcs.cn"}' /etc/passwd |
# awk '$1 ~/[09][09]$/(print $1}' test $1以两个数字结束就打印 |
2.6个关系运算符:< > <= >= == !=
#awk ‘length($0)<=80 {print $0}’ /etc/passwd |
#awk '$3 > 500 {print "Normal user"}' /etc/passwd |
# awk -F: '$1=="360565687" && $2=="15026736523"' list.txt |
四.使用布尔操作符的复合模式 (&&与,||或,!非)
#awk ‘($1 < 5 ) && ($2 > 8) {print "ok"}’ file1 #awk '/^d/ || /x$/ {print "ok"}' file1 |
# awk 'FNR>=1 && FNR<=2' /etc/passwd |
# awk 'FNR==1,FNR==3' /etc/passwd |
# awk -F: '/root/&&/bash/{print $6}' /etc/passwd |
# awk -F: 'BEGIN{ORS=""}!/oprofile/&&(/home/||/bash/){print $1"\n"}' passwd |