Awk 提取文本
- awk处理条件
- awk相关脚本
- awk流程控制
- awk扩展
1.1需求:
提取本机网卡流量,根分区剩余容量,获取ssh远程失败的IP地址 格式化输出/etc/passwd文件中的用户名/uid/宿主目录
1.2基本操作方法:
语法格式:awk [选项] ‘[条件{指令}]’ 文件
其中,print是最常用的编辑指令:如果有多条指令,用分号分隔:awk过滤数据时,支持仅打印谋一列,如第二列,第五列,处理文本时,如果未指定分隔符,则默认将空格 制表符作为分隔符
#Awk ‘{print $1,$3}’ test.txt(打印test文本第1 3行)
#Df -h | awk ‘{print $4}’(打印磁盘剩余空间)
-F 分割选项 可指定分隔符
#awk -F : ‘{print $1,$7}’ /etc/passwd
#awk –F [:](指定:和\为分隔符)
Awk常用内置变量:
$0 文本当前行的全部内容
$1 文本第一列内容
NR 文件当前行的行号
NF文件当前行的列数
#awk -F[?] ‘{print NR,NF}’ /etc/passwd(查看行列)(还可以打印常量 加字)
1) 提取ip地址
#ifconfig eno16777736
RX接受的数据量,TX是发送的数据量。Packets以数据包为单位,bytes以字节为单位
#ifconfig eno16777736 | awk ‘/RX p/{print $5}’
2) 提取根分区剩余容量
#df –h /
#df -h / | tail -1 | awk ‘{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲’ 使用正则: #df -h…/{print $4}’
3)根据/var/log/secure/日志文件,过滤远程连接密码失败的ip地址
#awk ‘/Failed/{print $11}’ /var/log/secure
格式化输出/etc/passwd文件
1) awk处理的时机
awk会逐行处理文本,支持在处理第一杠之前做的一些工作,以及在处理结束之后做总结性质的工作:
1.awk [选项] ‘[条件{指令}]’ 文件
2.awk [选项] ‘[BEGIN{指令}{指令}END{指令}]’ 文件
*BEGIN{}行之前处理,读取文件内容之前执行,执行一次
{} 逐行处理,读取文件过程中执行,执行N次
END{} 行后处理,读取文件过程中执行,执行一次
#统计系统中作为Bash登录的shell的用户总数
a. 预处理复制变量x=0
b. 逐行读入/etc/passwd文件,如果发现shell是/bin/bash,x+1
c. 全部结束后,输出x值
#awk ‘BEGIN{x=0}/bashKaTeX parse error: Expected 'EOF', got '#' at position 45: …sswd 2.awk处理条件 #̲awk -F: ‘/bash/{print}’ /etc/passwd
#awk -F: ‘/root/’ /etc/passwd
#awk -F: ‘^(root |adm)/{print $1,$3}’ /etc/passwd
#awk -F: ‘$1~/root/’ /etc/passwd
#awk -F: ‘$1!~/root/’ /etc/passwd (加!取反)
数字和字符串比较条件
== 等于
!=不等于
大于
= 大于等于
#awk -F: ‘NR==3{print}’ /etc/passwd
#awk -F: ‘$3<10{print $1,$3}’ /etc/passwd
#awk -F: ‘$1=”root”’ /etc/passwd
#awk -F: ‘$3>10 && $3<20’
#awk ‘BEGIN{X++;print x}’ 1
#awk ‘BEGIN{x=8;print x+=2}’ 10
#awk ‘BEGIN{x=8;x–;print x}’ 7
#seq 200 | awk ‘KaTeX parse error: Expected 'EOF', got '#' at position 112: …存到getupwd.log #̲!/bin/bash A=(awk –F: ‘ /bash$/{ print $1 }’ /etc/passwd)
for i in $A
do
grep $i /etc/shadow |awk -F: ‘{print $1,”–>”,KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲’ done #!/bin/b…(sed -n ‘/bash$/s/:.//p’ /etc/passwd)
For I in A D o P a s s 1 = A Do Pass1=ADoPass1=(grep i / e t c / s h a d o w ) P a s s 2 = i /etc/shadow) Pass2=i/etc/shadow)Pass2=(pass1#?
Pass3=( p a s s 2 E c h o “ (pass2%%:*) Echo “(pass2Echo“i -----> $pass3” >> ./getupwd.log
Done
4.awk流程控制:单分支,多分支,for循环
#awk -F: ‘{if($3<=1000){i++}END{print i}}’(统计/etc/passwd/中uid小于等于1000的用户个数)
#awk -F: ‘{if(7 / b a s h 7~/bash7 /bash/){i++}END{print i}}’
#awk -F: ‘{if($3<=1000){i++}else{j++}END{print I,j}}’
数组:
#awk ‘BEGIN{a[0]=0;a[1]=11,a[2]=22;for(i in a){print i,a[i]}}’
#awk ‘BEGIN{a[“haha”]=11;print a[“haha”]}’
11
Awk统计web访问排名:
#awk ‘{ip[$1]++}END{for(i in ip){print ip [i],i}}’ /var/log/httpd/access.log> | sort -nr