1、sed (Stream EDitor) 流式编辑器
1.1 说明
非交互、逐行处理
Vim ——硬盘到内存,一次全部显示
Sed ——一行到内存的显示
1.2 使用方法
sed [-nefri] ‘command‘ test.txt
参数说明:
-n 取消默认控制台输出,与p一起使用打印指定内容
[root@server0 ~]# sed -n ‘3p‘ /etc/passwd #显示第3行
不加-n的时候,会在第三行将第三行重复打印 (-n取消自动打印模式空间)
屏蔽默认输出
-r, --regexp-extended 在脚本中使用扩展正则表达式
-i 直接修改文件内容
-e 指定多个命令
sed -ne ‘3p‘ -e ‘5p‘ /etc/passwd
-f 指定命令文件
sed -f command.sed /etc/passwd
command.txt文件书写执行的动作命令
案例
sed -f command.sed -n /etc/passwd
command.sed 文件内容为 3p
动作说明:
p 打印;a 新增; c 取代;d 删除;i 插入; s 替换
p 显示(print)
sed -n ‘3p;5p‘ /etc/passwd #显示第3,第5行 多个指令用分隔符
sed -n ‘3,5p‘ /etc/passwd #显示第3到第5行
sed -n ‘3,+5p‘ /etc/passwd #显示第3行以及其后的5行
sed -n ‘p;n‘ /etc/passwd #输出奇数行,sed自动读行,给n拒绝
sed -n ‘n;p‘ /etc/passwd #输出偶数行
sed -n ‘$=‘ /etc/passwd #输出文件的行数 wc -l
sed -n ‘/834/!p‘ /etc/passwd #输出不包括843的行
根据正则相结合使用(不知道行号)
[root@server0 ~]# sed -n ‘/root/p‘ /etc/passwd #找出/root并显示出来
d 删除(delete)
sed ‘3,5d‘ /etc/passwd #删除3到5行
sed ‘/xml/d’ /etc/passwd #删除所有包含xml的行(整行删除)
sed ‘/xml/!d’ /etc/passwd #删除不包含xml的行
s 替换 (substitution)
sed ‘s/old/new/’ #文件每行第一个old替换为new
sed ‘3s/old/new/’ #文件第3行第一个old替换为new
sed ‘s/old/new/g’ #文件所有old替换为new
sed ‘s/old/new/3’ #文件每行第三个old替换为new
sed ‘s/old//g #文件所有old替换为空
sed ‘s/old/&s/g’ #文件所有old替换为olds
sed ‘s#/bin/bash#/sbin/sh#‘ #可以使用任何特殊符号作为分隔符必须3个
sed ‘s/\/bin\/bash/\/sbin\/sh/‘ #太复杂
i(insert) a(append) c
sed ‘2i xxx‘ 1.txt #在第2行的前面插入xxx
sed ‘2a xxx‘ 1.txt #在第2行的后面插入xxx
sed ‘2c xxx‘ 1.txt #第2行替换为xxx (整行替换)
sed ‘2i xx\nyy‘ 1.txt #在第2行的前面插入xx和yy
r w h g
sed ‘1r /etc/hostname‘ 1.txt #在第一行后加入/etc/hostname的内容
sed ‘w /qq.txt‘ 1.txt #在根下另存为qq.txt(不用i已经存了)
sed ‘2H;4G‘ 1.txt #在第2行复制内容加回车在第4行粘贴第2行内容加回车
sed ‘2h;4g‘ 1.txt #在第2行复制内容覆盖第4行为第2行的内容
2、awk 数据过滤软件
2.1 说明
逐行处理 (grep只能整行)
可以过滤列
格式: awk [选项] ‘条件{指令}’ 文件
条件可以没有,代表所有
也可以没有指令,打印整行
不能同时没有条件和指令
df | awk ‘/\/$/{print $4}‘ #查看以/结尾的第4列的信息 根的磁盘剩余
tailf /var/log/secure #查看远程登录日志
用途:监控脚本:
登录日志
分区剩余容量:df
df -h | awk ‘/\/$/{print $5}‘ | awk -F % ‘{print $1}‘
内存剩余容量:free
free -h | grep Mem | awk ‘{print $4}‘
CPU负载大于xx: top ,uptime
load average: 0.07, 0.21, 0.21
[1,5,15分钟的平均负载]
2.2 awk 命令,变量
默认使用空格或者tab作为分割符号
-F 指定分隔符(默认空格或者tab)
awk -F: ‘{print $1}‘ /etc/passwd #使用:作为分隔符
awk -F: ‘{print $1,$3,$7}‘ /etc/passwd #打印多列
打印变量:
print $0 #整行
print $1 #第一列
print $2 #第二列
print NR #当前行的行号
print NF #当前行的列号
print $NF #打印最后一列
打印常量:(字符串需要加引号)
awk ‘{print "dachui"}‘ /etc/passwd #每一行都出来(只有)dachui
awk -F ":" ‘{print "第"NR"行""第"NF"列"}‘ /etc/passwd
2.3 awk处理的时机
awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。在命令格式上分别体现如下:
行前处理,BEGIN{ } #读取文件之前,执行1次
逐行处理,{ } #读取文件过程中执行,执行n次
行后处理,END{ } #读取文件之后,执行1次
awk -F: ‘BEGIN{print "用户名\tUID\t家目录"} {print $1,$3,$6} END{print "总用户 "NR}‘ /etc/passwd
awk ‘BEGIN{x=2;y=3.3;print x*y}‘ #不加其它选项作为运算使用
awk变量可以不定义,就直接用(默认0)
awk ‘BEGIN{x=0} /bash$/{x++} END{print x}‘ /etc/passwd
awk ‘/bash$/{x++} END{print x}‘ /etc/passwd
2.4 awk处理条件
1)使用正则表达式设置条件
~(模糊)匹配 !~不匹配
awk ‘/root/‘ /etc/passwd #对整行匹配
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
awk -F: ‘$1~/root/‘ /etc/passwd #匹配第一列是root
root:x:0:0:root:/root:/bin/bash
awk -F: ‘$7!~/bash$/‘ /etc/passwd #匹配第7列不是bash结尾的行
2)使用数值/字符串比较设置条件 (字符串需要引号,精确匹配)
== != >= <= > <
awk -F: ‘$1=="root" /etc/passwd #精确匹配第一列是root的行
3)逻辑测试条件
&&逻辑与
awk -F: ‘$3>=10 && $3<=20‘ /etc/passwd
|| 逻辑或
awk -F: ‘$3==0 || $3==1000‘ /etc/passwd
4)数学运算
+ - * / % ++ --
seq 200 | awk ‘$1%7==0 || $1~/7/‘ #200以内能够整除7并且包含7的
2.5 awk流程控制
1)if分支结构(双分支、多分支)
找出多少系统用户,多少普通用户
awk -F: ‘{if ($3>=1000){x++}else{y++}}END{print x,y}‘ /etc/passwd
找出第一列是M.Tansley并且第六列-1,输出1,6,7列
awk ‘{if($1=="M.Tansley")$6-=1;print $1,$6,$7}‘ awk_exe.txt
2)while循环结构
统计词频[文章,日志,文件]
例:统计/etc/passwd中的root出现的次数
[root@svr5 ~]# awk -F [:/] \
‘BEGIN{j=0}\
{i=1}{while(i<=NF){if($i~/root/){j++};i++}}\
END{print j}‘ /etc/passwd
4
awk -F : ‘{i=1;while(i<=NF){if($i~/root/){j++};i++}}
END{print j}’ /etc/passwd
3)break、continue等其他控制语句
2.6 awk公式
ab -c 100 -n 10000 http://172.25.0.11/ #模拟100个人同时访问网站,点击页面1000次。IP后必须写/
拒绝服务***(DOS***)
例:提取IP地址及访问量
awk ‘{A[$1]++} #统计第一列的IP
END{for(i in A){print i,A[i]}}‘ #对每个IP循环得到每个IP的次数
/var/log/httpd/access_log |
awk ‘$2>=500{print $1}‘ #找出访问次数大于500的IP
例:写一个进度条脚本
#!/bin/bash jindu(){ while : do echo -n ‘#‘ sleep 0.3 done } jindu & cp -r $1 $2 kill $!
原文:https://www.cnblogs.com/cp-linux/p/13200508.html