Linux的Shell脚本——day6——awk文本检索

13 篇文章 0 订阅

自动对齐
  column -t 文本
  echo '内容' | column -t

[Lyu@root ~]#awk -F: 'BEGIN{print "用户名","UID","家目录"}{print $1,$3,$(NF-1)}END{print "一 共"NR"行"}' /etc/passwd | column -t
用户名           UID    家目录
root             0      /root
bin              1      /bin
daemon           2      /sbin
adm              3      /var/adm
lp               4      /var/spool/lpd
………………(太长就不全显示了)
一共42行

排序:
  sort [选项]  排序文本
  选项:
   -n表示按数字顺序升序排列
   -r表示反序,如果要数组降序排列就要用-nr
   -k可以指定按第几个字段来排序
  
  也可以用管道发给sort:  cat 文本 | sort -nr


awk  选项  '条件{指令}'  文件
    支持拓展正则
    不写指令的时候默认是{print} ,打印符合条件的行的全部内容

条件

命令格式作用例子解释
'/正则表达式/{命令}'按照正则表达式匹配行,匹配成功后执行命令awk '/Accept/{print $11}' /var/log/secure查看哪些IP成功远程登陆了
'BEGIN{指令}'在读文件前执行一次awk 'BEGIN{print "开始打印"}{print $(NF-1)}' test.txt先输出“开始打印”然后输出倒数第二列的值
awk 'BEGIN{x=1;y=2.5;print x+y}'如果awk中只有BEGIN,则可以不跟文件,把awk可以当计算器使用
awk 'BEGIN{x=0}/bash$/{x++}END{print "一共"x"行"}' /etc/passwd统计一共有多少个以bash为解释器的用户,先用BEGIN创建x初始化为0,然后判断是不是bash结尾如果是就让x+1,最后输出一共有多少行
'END{指令}'在读完文件后执行一次
awk '{print $NF}END{print "打印结束"}' test.txt输出最后的值最后输出“打印结束”
awk 选项 'BEGIN{指令1}条件{指令2}END{指令3}'  执行指令1,然后一行一行读文件,如果哪行满足条件,执行指令2,文件完全读完后,执行指令3
'!/正则表达式/{命令}'按照正则表达式匹配行,匹配失败后执行命令
'$数字n~/正则表达式/{命令}'对每行的第n列进行正则匹配,匹配成功后执行命令awk -F: '$5~/^root/' /etc/passwd每行的第5列进行匹配看,这行这列的数据是不是root开头的(注意这里不是行首匹配了),如果是就输出所有(不写指令默认输出所有)
'$数字n!~/正则表达式/{命令}'对每行的第n列进行正则匹配,匹配失败后执行命令
'变量==具体值{命令}'变量和具体值完全相同,执行命令,具体值可以是变量,不是变量用" "标示出来
'变量!=具体值{命令}'变量和具体值不相同,执行命令,具体值可以是变量,不是变量用" "标示出来
'变量>=具体值{命令}'变量大于等于具体值,执行命令,具体值可以是变量,不是变量用" "标示出来
'变量<=具体值{命令}'变量小于等于具体值,执行命令,具体值可以是变量,不是变量用" "标示出来
'变量>具体值{命令}'变量大于具体值,执行命令,具体值可以是变量,不是变量用" "标示出来
'变量<具体值{命令}'变量小于具体值,执行命令,具体值可以是变量,不是变量用" "标示出来
'逻辑判断1&&逻辑判断2'满足判断1并且满足判断2的匹配成功
'逻辑判断1||逻辑判断2'满足判断1或者满足判断2的匹配成功

变量

变量名作用例子解释
自定义自定义的一个变量,如果没有赋予初始值,默认为0x=2;x++定义一个变量x,赋予初始值为2,然后进行自+1操作
$数字n文本的第n列,但是$0代表文本当前行的全部内容
NR当前行号df -h | awk 'print NR'输出一共多少个挂载
NF当前行一共的列数df -h | awk 'print NF'输出df一共显示多少列数据
$(NF-数字n)当前行倒数第(n+1)列awk '{print $(NF-1)}' test.txt打印文件的倒数第二列
awk -F: '{print $1,$NF}' /etc/passwd打印用户的解释器,答应每行第一列和最后一列
数组名[下标]自定义数组,数组的下标可以是字符串,不一定要是数字awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'遍历打印数组中所有的数组下标和对应的数组值

指令

命令格式选项 & 作用例子解释
print编辑命令   如果有多个可以用 ; 分割开来
'条件{print $列数}'按照要求答应相应列数,默认分割符号是空格和制表符df-h | awk '{print $1,$4}' test.txt打印文件系统和可用容量
-F 指定分割符号,F后面指定可以是任何符号(如果用\,需要写成\\),[ ]里面可以写多个分割符awk -F: '{print $1,$3}' /etc/passwd打印用户名和其UID
awk -F[:/] '{print $2,$7}'以:和/作为分割符输s出第一列和第七列数据
'条件{if(判断){命令}else{命令}}'多分支判断控制awk -F: '{if($3<1000){x++}else{y++}}END{print "系统用户个数为:"x;print "管理员创建用户个数为:"y' /etc/passwd检索判断出系统用户和自创用户个数

注意:
    1.如果awk中需要用常量需要用" "标示出来,而变量可以不用$,只要不是" "里面的都当成变量
    2.在使用的时候print可以用逗号分割,打印的时候会出来空格,也可以不用

awk -F: '{print $1,"的解释器:",$NF}' /etc/passwd    #  输出示例:root 的解释器: /bin/bash (这三个部分间都有一个空格)
awk -F: '{print $1"的解释器:"$NF}' /etc/passwd    #  输出示例:root的解释器:/bin/bash(之间没有空格)

    3.多条命令可以用 ; 隔开,这杨可以一次执行
    4.在脚本中如果有变量参与,可以用分号把原有命令分割开来 awk -F: '$1=="'$i'"{print $2}' /etc/shadow 这里$i就是脚本中定义的变量,如果不考虑变量内部格式应该是 '$1=="root"{print $2}' 如果想把root单独取出就把root前的$1=="用' ' 隔离开来,"{print $2}也用 ' ' 隔离开,中间的root就可以用变量代替,因为他追根究底是一个字符串,然后作为一个参数给awk
    5.在awk中的for循环for(i in a) 循环的是a数组的下标,如果要遍历输出a数组的内容,用下面的语句for(i in a){print a[i]},而且数组的下标可以是字符串,不一定要是数字
    6. awk '{a[$1"--"$7]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log 用来检索统计出一个ip访问某个网页多少次,/var/log/httpd/access_log的第一列是ip,第七行是访问的网络地址,而用的是一个数组a,其下标是 [ip--地址] ,因为awk的的数组下标可以是随意的字符串,这样用下标来标示是ip和地址,相同的ip和地址就放在一起存储,有一个就+1,最后可以完成统计。


统计次数:
    公式:awk -F分割符号 '{a[$第几列]++}END{for(i in a){print i,a[i]}}' 文件
    用来统计文件中以某列为标识,统计该标识出现多少行。

检查网页是否遭受DOS攻击

awk '{a[$1" "$7]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log | awk '$3>1000{print $1,$2}'

    自动检测某个网页,被同一个IP访问超过1000次,这IP就算攻击者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值