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部分。