一,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