awk正则
awk的可以通过正则或者其他的函数,来实现过滤功能。正则的功能非常的强大,不过话说,正则一般性能都不是特别的高。在一定的场合下,正则也需是非常适合的工具。
资源
部分内容来参考
https://blog.csdn.net/ha_weii/article/details/80761559
正则匹配
awk如果仅有条件,可以省略掉if(条件){print $0},简写为条件。故正则匹配也能按这样处理。
字段匹配
使用波浪号 ~来进行正则匹配。!~表示相反的意思,去除包含匹配上的内容。
netstat -na |grep ESTABLISHED |grep -v 127.0.0.1 |awk '$5~/^10.181.86.12/'
netstat -na |grep ESTABLISHED |grep -v 127.0.0.1 |awk '$5!~/^10.181.86.12/'
匹配末尾
awk '/bash$/{print $0}' passwd 打印以bash结尾的行
匹配开头
awk '/^ro/{print }' passwd
awk '/^[a-d]/{print }' /etc/passwd # 打印/etc/passwd里面以a或b或c或d开头的行
awk '/^[^a-d]/{print }' /etc/passwd # 打印/etc/passwd里面不以a,b,c,d开头的行
正则条件 运算
使用&&、||来进行逻辑连接。
awk '/^a/||/nologin$/{print }' # /etc/passwd 打印以a开头或者以nologin结尾的行
awk '/^a/&&/nologin$/{print }' # /etc/passwd 打印以a开头并且以nologin结尾的行
# 打印以冒号为分隔符,第6列中不以/home开头,并且不以bash结尾的行的第1列####\/home中的\表示对/的转义
awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
注入外部变量
参数方式=
a=1
b=2
seq 1 |awk '{print a,b}' a=$a b=$b
# 1 2
# 下面顺序错误
#seq 1 |awk a=$a b=$b '{print a,b}'
参数方式-v
a=1
b=2
seq 10|awk -v a=1 -v b=2 '{print a,b}'
# 下面顺序错误
# seq 10|awk '{print a,b}' -v a=1 -v b=2
如未定义变量,则输出为空。
字符拼接
不知道怎么形容这种方式,暂且叫做拼接方式吧。
hello=123
seq 10|awk '{print "'$hello'" }'
# 直接echo 参数
echo '{print "'$hello'" }' # 1、'{print "' 2、 $hello 3、 '" }'
解释:其实是字符串拼接,多个字符串跟变量 直接 拼接。如上,被分成3部分。