Linux常用命令:awk
显示指定行
代码语言:javascript
复制cat /proc/meminfo |awk 'NR==1'
#显示第一行
awk '/^[0-9]/ && NR==1 {print $1}' /data/hostlist
# 过来数字开头而且是第一行,打印第一列;&&和||或
ifconfig |awk '/netmask/ && !/127/ {print $2}'
# 匹配netmask 并匹配非127
分隔显示
代码语言:javascript
复制cat /proc/meminfo |awk 'NR==1'|awk '{print $2}'
#显示第二列
curl -s --head "ops.attacker.club"|awk '/HTTP/ {print $2}'
#过滤关键字‘HTTP’的行并将第二列内容打印出来
正则
代码语言:javascript
复制awk -F= '/^DEV/ {print "网卡"$2}' /etc/sysconfig/network-scripts/ifcfg-eth0
#正则搜索DEV大头的行,打印第二列网卡名
route -n | awk '$3~/252.0$/{print $1}'|uniq
#正则匹配第三列掩码是252.0则打印第一列网络地址
docker images | awk '/rancher/||/busybox/ {print $3}'| xargs docker rmi
#删除包含rancher或者busybox的容器id
ip add |grep -vw lo |awk -F '[ /] ' '/inet/ {print $3}'
#[空格:]多分隔符写法,以空格或冒号做分隔;" "号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。
awk '/ldb/ {print}' f.txt #匹配ldb
awk '!/ldb/ {print}' f.txt #不匹配ldb
awk '/ldb/ && /LISTEN/ {print}' f.txt #匹配ldb和LISTEN
awk '$5 ~ /ldb/ {print}' f.txt #第五列匹配ldb
高级玩法
代码语言:javascript
复制awk -F: '$3>=1000 {print $1}' /etc/passwd
#第三列值大于等于1000则打印passwd第一列的用户名
awk -F: 'length($3)==2 {print $1}' /etc/passwd
#第三列字符串是2位长度的,打印第一列用户名信息
#;查看是否存在空口令帐户
awk -F: '{system("passwd -S "$1)}' /etc/passwd|awk '{print $1,$3}'
#用system和bash执行命令;查看账户创建日期
awk -F: '{system("passwd -S "$1)}' /etc/passwd|awk '{print $1,$3}'
#同上
#过滤登录失败的ip地址,awk if如果第一列数字有8次以上则打印第二列ip信息
awk '$1> 8 {print $2}'
#同上,效果
grep Failed /var/log/secure |egrep -o '[0-9]{1,3}(.[0-9]{1,3}){3}' |sort |uniq -c|sort -nr | awk '{if($1 > 8) print $2}'
grep Failed /var/log/secure |egrep -o '[0-9]{1,3}(.[0-9]{1,3}){3}' |sort |uniq -c|sort -nr | awk '{if($1 > 8) print $2}'
代码语言:javascript
复制#[0-9]{1,3}(.[0-9]{1,3}){3}
[0-9]{1,3}:1-3位数字
.[0-9]{1,3}:小数点.后跟1-3位数字
(...){3}:前面括号中的组合重复3次
正则表达式中:
.表示“单个任意字符”
.表示“小数点”
关于IP地址,再提供一种更精确的写法:
d表示“单个任意数字”
((d{1,3}).){3}(d{1,3}):与你的式子基本等价
![.d]):后面不能有.或数字