awk的认识与使用【shell第五天】

xiaoxiao2021-02-28  37

核心:文本过滤           查看/过滤文件 与sed一样,逐行处理 awk :过滤数据时支持仅打印某一列;若有多条编辑指令,可用分号分隔。          【print 是最常用的编辑指令】 格式: awk [选项] '[条件] {指令}' 文件 例:          实验文本: [root@server0 ~]# cat tmp.txt  hello wolrd ni hao wo shi           查看文本第一列: [root@server0 ~]# awk '{print $1}' tmp.txt    hello ni wo        查看多列: [root@server0 ~]# awk '{print $1,$2}' tmp.txt  hello wolrd ni hao wo shi       实用:【可管道给其他命令】          查看可用容量: [root@server0 ~]# df -h | awk '{print $4}' 可用 7.1G 906M 921M 904M 921M 二)选项的使用: -F :可指定分隔符 -F[:/] :可识别多种单个字符【可指定】 例:【-F】            查看/etc/passswd的第一列【以冒号为分隔符】 [root@server0 ~]# awk -F: '{print $1}' /etc/passwd root bin daemon adm lp ...             【-F[:/]】 [root@server0 ~]# awk -F[:/] '{print $1,$7}' /etc/passwd root root bin bin daemon sbin adm var lp var sync sbin shutdown sbin ... 三)可与变量和常量结合使用 常见变量: NR 文件当前行的行号 NF 文件当前行的列数(有几列) 例: 【NR】 [root@server0 ~]# awk -F:  '{print NR}' tmp.txt  1 2 3 【NF】 [root@server0 ~]# awk -F: '{print NF}' tmp.txt 1 1 1            常量的使用【需加双引号】 例: [root@server0 ~]# awk -F: '{print $1,"的解释器为",$7}' /etc/passwd root 的解释器为 /bin/bash bin 的解释器为 /sbin/nologin daemon 的解释器为 /sbin/nologin adm 的解释器为 /sbin/nologin ... 四)与正则的使用: [root@server0 ~]# cat tmp.txt hello wolrd ni hao wo shi        【查看包含ni的行的第2列】 [root@server0 ~]# awk /ni/'{print $2}' tmp.txt  hao        【查看远程登陆失败的ip】 [root@server0 ~]# awk /Failed/'{print $11}' /var/log/secure 172.25.0.10 172.25.0.10 五)awk处理时机

 格式:

awk [选项] 'BEGIN{指令} {指令}END{指令}' 文件     BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次     { } 逐行处理,读取文件过程中执行,指令执行n次     END{ } 行后处理,读取文件结束后执行,指令执行1次           【先为x赋值为0,然后进行++最后输出x】 [root@desktop0 ~]# awk 'BEGIN{x=0} /bash$/{x++}END{print x}' /etc/passwd 2 [root@desktop0 ~]# awk '/bash$/{x++}END{print x}' /etc/passwd  【默认0开始】 4

           【按顺序列出用户名,uid,家目录,总和】

[root@desktop0 ~]# awk -F: 'BEGIN{print "yong" "UID" "jia" "zong" } {print $1,$3,$6}END{print "zong"NR }' /etc/passwd |column -t column -t  【自动对齐】

六)awk处理条件

1.使用正则设置条件 【模糊匹配】        /正则/     在一整行里匹配        $n~/正则/    $1~/正则/  $2~/正则/ 【第一列包括和第二列包括。。。】        $n!~/正则/  取反 [root@desktop0 ~]# awk -F:  '$7!~/nologin$/' /etc/passwd 2.字符和数字的比较 ==  !=  >  >= <  <=  【精准匹配】        【打印出第1行的第一列】 awk  -F: 'NR==1{print $1}' /etc/passwd          【打印UID大于等于1000的第1和第3列】 [root@desktop0 ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd   nfsnobody 65534 student 1000 jiajia 1001          【精确查找第一列是root的行】 [root@desktop0 ~]# awk -F: '$1=="root"' /etc/passwd root:x:0:0:root:/root:/bin/bash           【300中能被3整除的数】 [root@desktop0 ~]# seq 300 | awk '$3%==0'           【300中能被3整除并包含3的数】 [root@desktop0 ~]# seq 300 | awk '$1%3==0&&$1~/3/' 3.逻辑测试条件: && 和 ||             【打印UID大于10小于20的行】 [root@desktop0 ~]# awk  -F:  '$3>10&&$3<20' /etc/passwd operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin              【打印UID等于10的行若没有则打印UID等于1000的行】 [root@desktop0 ~]# awk -F: '$3==10||$3==1000' /etc/passwd student:x:1000:1000:Student User:/home/student:/bin/bash 4.单双分支        awk [选项] '[条件]{指令}' 文件 if语句 if(判断){指令} if(判断){指令}else{指令} 单分支 [root@desktop0 ~]# awk -F: '{if($3>1000){x++}} END{print x}' /etc/passwd 双分支 [root@desktop0 ~]# awk -F: '{if($3>1000){x++}else{y++}} END{print x,y}' /etc/passwd 3 38

5.数组:一个可以存储多个值的变量 [root@desktop0 ~]# x=(11 22 33) [root@desktop0 ~]# y[0]=11 [root@desktop0 ~]# y[1]=22 [root@desktop0 ~]# y[2]=33 [root@desktop0 ~]# echo ${x} 11 [root@desktop0 ~]# echo ${x[1]} 22 [root@desktop0 ~]# echo ${y} 11   awk 数组: [root@desktop0 ~]# awk 'BEGIN{x[0]=11;x[2]=22;print x[2],x[0]}' 22 11         【当数组多时,利用for循环读出】 [root@desktop0 ~]# awk 'BEGIN{x[0]=12;x[1]=35;x[2]=45;x[3]=456;for(i in x){print x[i]}}' 12 35 45 456 扩展:常见的低成本攻击 【DOS攻击 deny of service】 ab -c 100 -n 100000 http://172.25.0.10/ 模拟有100人上网,访问网站10w次

应对方法:

         【查看异常:列出IP的访问次数】 [root@desktop0 ~]# awk '{a[$1]++}END{for(i in a){print a[i],i}}' /var/log/httpd/access_log  | sort -n 10 ::1 26141 172.25.0.250 sort -n 排序
转载请注明原文地址: https://www.6miu.com/read-2624672.html

最新回复(0)