awk基本用法 、 awk应用案例 、 综合脚本

链接

一,sed其他指令:

a行下追加 i行上添加 c 替换整行

sed 'a 666' user    //所有行的下面追加666
sed '1a 666' user   //第1行的下面追加666
sed '/^bin/a 666' user   //在以bin开头的行的下面追加666
sed 'i 666' user  //所有行的上面添加666
sed '5i 666' user   //第5行的上面添加666
sed '$i 666' user  //最后1行的上面添加666
sed 'c 666' user   //所有行都替换成666
sed '1c 666' user  //替换第1行为666

二,awk

可以实现精确搜索
awk使用方式
1,前置指令 | awk 选项 条件 指令
2,awk 选项 条件 指令 被处理文档
选项 -F 定义分隔符
指令 print 输出
内置变量 $1第1列 $2第2列 $3第3列 ......$0所有列 NR行号 NF列号

awk '{print}' user     //输出所有行
awk '/root/{print}' user    //输出包含root的行
awk '/root|bin/{print}' user   //输入包含root或bin的行

awk '{print $1}'  user   //输出所有行的第1列
awk '/root/{print $1}' user     //找包含root的行,显示第1列
awk '/^bin/{print $3}' user   //找以bin开头的行,显示第3列
awk '/^bin/{print $3,$1}' user     //找以bin开头的行,显示第3列,第1列
awk '/^bin/{print $3,$1,$0}' user  //找以bin开头的行,显示第3列,第1列,所有列
awk '/^bin/{print NR}' user    //找以bin开头的行,显示该行的行号
awk '/^bin/{print NR,$0}' user   //找以bin开头的行,显示该行的行号,所有列
awk '{print NF}'   user   //输出所有行的列号(每行有几列)

awk -F: '{print $1}' user   //文档中如果没有空格,可以用F修改分隔符
awk -F: '{print $1,$6}' user    //使用冒号作为列的分隔符,显示第1、6列
awk -F: '{print $1" 的家目录是 "$6}' user    //还可以输出常量,加双引号即可
awk -F: '{print $1" 的解释器是 "$7}' user

收集根分区剩余容量

df -h | awk  '/\/$/{print  $4}'    //使用df  -h 作为前置指令交给awk处理找到以/结尾的行,并输出第4列
df -h | awk  '/\/$/{print  "根分区剩余容量是"$4}'

收集网卡流量信息

ifconfig eth0 | awk  '/RX p/{print  "服务器eth0网卡的接收数据量是"$5"字节"}'
ifconfig eth0 | awk  '/TX p/{print  "服务器eth0网卡的发送数据量是"$5"字节"}'

三,awk中的条件

1,使用正则 ~包含 !~不包含

awk -F: '$5~/bin/{print}' user   //找第5列包含bin的行
awk -F: '$5!~/bin/{print}' user  //找第5列不包含bin的行

2,使用数字或者字符串

== != >= > <= <

awk -F: 'NR==1{print}' user   //找第1行
awk -F: 'NR<=3{print}' user    //找1~3行
awk -F: '$7=="bash"' user  //找第7列等于bash的行
awk -F: '$7!="bash"' user   //找第7列不等于bash的行

3,逻辑组合 && 并且 || 或者

awk -F: '$7~/bash/&&NR<=3{print}' user  //找第7列包含bash并且行号是1~3的
awk -F: '$7~/bash/||NR<=3{print}' user  //找第7列包含bash或者行号是1~3的

4,运算
+ - * / %
+

awk -F: '$3%2==0' /etc/passwd    //输出id号是偶数的用户

四,awk处理时机,可以执行额外任务

BEGIN{ } 执行1次,读取文档之前执行
逐行任务 执行n次,读取文档时执行
END{ } 执行1次,读取文档之后执行

awk BEGIN{ }{ }END{ } //基本格式


awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6 }END{print "总计"NR"行"}' user    //按下图输出信息,其中\t可以实现tab键效果,有一定的对齐功能
-

使用awk统计网站访问量
开启httpd服务,80端口或者82端口都可以
使用curl 192.168.4.7:82 或127.0.0.1:82 或 其他主机 多访问几次网站
测试时可以关闭防火墙和selinux

systemctl stop firewalld
setenforce  0
awk  '{print $1}'  /var/log/httpd/access_log

五,awk数组加for循环实现高级搜索

数组 相当于可以存储多个值的特殊变量
数组名称[下标]=下标对应的值

a[1]=10
a[2]=20
awk 'BEGIN{a[1]=10;a[2]=20;print a[2],a[1]}'    //使用awk测试数组,首先创建数组a,下标1对应值是10,下标2对应值是20,然后输出下标是2与下标是1的值
awk 'BEGIN{a["aa"]="abc";a["xx"]="xyz";print a["xx"],a["aa"]}'   //数组的下标与值都可以不是数字

数组用来收集信息
for循环可以循环输出数组的下标

awk 'BEGIN{a[1]=10;a[2]=20;for(i in a){print a[i]}}'   //首先创建数组,定义了几个下标与对应的值,然后利用for循环,可以循环显示数组a的下标,下标都存在变量i中,最后喊出,数组中有几个下标,就会喊出几个结果

abc    a[abc]++     a[abc]=1
xyz    a[xyz]++     a[xyz]=1
abc    a[abc]++     a[abc]=2
opq    a[opq]++     a[opq]=1
xyz    a[xyz]++     a[xyz]=2
abc    a[abc]++     a[abc]=3

awk '{a[$1]++}END{for(i in a){print a[i],i}}' abc.txt   //使用逐行任务与数组收集文档abc.txt中的信息,然后在END任务中使用for循环显示所有数组a的值与下标

awk '{a[$1]++}END{for(i in a){print i,a[i]}}'  /var/log/httpd/access_log  //将上述的abc.txt文件替换成网站的日志,就可以最终用来查看日志得到可以得到哪个ip来访以及来访的次数

awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log |sort -nr -k 2
//使用sort命令增加排序功能,-n是以数字形式排序,-r是降序, -k是指定为

#第几列排序

awk '/Failed password for root/{a[$11]++}END{for(i in a){print i,a[i]}}' /var/log/secure
//使用awk数组+for循环收集安全日志中关于登录root账号密码错误的ip记录

编写脚本,可以收集系统信息

#!/bin/bash
while :
do
clear      //可以实现清屏效果
awk 'END{print "用户总数是"NR"个"}' /etc/passwd
uptime | awk '{print "cpu的15分钟平均负载是"$NF}'
free -h | awk '/^Mem/{print "内存剩余空间是"$4}'
echo 当前登陆服务器用户数量是$(who | wc -l)个
echo 当前进程数量是$(ps aux | wc -l)个
echo 服务器安装软件包总数是$(rpm -qa | wc -l)个
sleep 3     
done

你可能感兴趣的:(awk基本用法 、 awk应用案例 、 综合脚本)