文本三剑客之——西门吹雪grep,叶孤城awk,独孤求败sed
1、西门吹雪grep
grep [选项]… 查找条件 目标文件
- -i:查找时忽略大小写
- -v:反向查找,输出与查找条件不相符的行
- -o 只显示匹配项
- -f 对比两个文件的相同行
- -c 匹配的行数([root@localhost ky15]# grep -c root passwd 2)
选项:
-color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止 grep -m 1 root /etc/passwd #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反 grep -Ev ‘[[:space:]]*#|$’ /etc/fstab
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数 grep -c root /etc/passwd #统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行 grep -A3 root /etc/passwd #匹配到的行后3行业显示出来
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file grep -e root -e bash /etc/passwd #包含root或者包含bash 的行 grep -E root|bash /etc/passwd
-w 匹配整个单词 grep -w root /etc/passwd useradd rooter
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
[root@localhost /]# cat /etc/passwd |grep -v ‘^$’ >1.txt
[root@test1 opt]# grep "^b" 123.txt //过滤已b开头
grep 's$' 123.txt //过滤已s结尾的行
[root@localhost yum.repos.d]# ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
统计当前主机的连接状态
[root@localhost ~]# ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
3 ESTAB
17 LISTEN
统计当前连接主机数
[root@localhost ~]#ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c
3 192.168.91.1
1 192.168.91.101
1 Address
E表示扩展正则表达式,可以不使用\
-w 匹配整个单词
grep -w root /etc/passwd //过滤出/etc/passwd文件中root单词
2、叶孤城awk
2.1awk基本介绍
- AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
- 可以在无交互的模式下实现复杂的文本操作
- 相较于sed常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
- 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
2.2基本格式
awk [选项] ‘模式条件{操作}’ 文件1 文件2...
awk -f|-v 脚本文件 文件1 文件.....
2.3工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中, 并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、““表示"或”、”!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
2.4常见的内建变量(可直接用)
FS∶ 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
- NF∶ 当前处理的行的字段个数。
- NR∶ 当前处理的行的行号(序数)。
- $0∶当前处理的行的整行内容。
- $n∶ 当前处理行的第n个字段(第n列)。
- FILENAME∶ 被处理的文件名。
- RS∶ 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
- $NF:最后一段
- $(NF-1):倒数第二段
2.5awk相关示例
2.5.1打印文本内容
- awk可以将自动将多个空格压缩成一个空格
- 打印字符串需要加双引号
打印磁盘已经使用情况
df |awk '{print $5}'
awk '{print "hello"}' //打印字符串
打印字符串确定文件有多少行
2.5.2根据$n以及NR提取字段
根据$n以及NR提取字段
$n,代表提取第几列
ifconfig ens33|sed -n '2p'|awk '{print $2}' //提取ip地址
ifconfig ens33 |awk 'NR==2{print $2}' //提取ip地址
ifconfig ens33|grep netmask|awk '{print $2}' //提取ip地址
提取ipv6地址
ifconfig ens33|sed -n '3p'|awk '{print $2}'
ifconfig ens33 |awk 'NR==3{print $2}'
ifconfig ens33 |grep inet6 |awk '{print $2}'
2.5.3 根据选项-F指定分隔符
根据选项-F指定分隔符
打印/etc/passwd所有用户名
打印多列内容:打印时逗号可以表示空格,如果使用“:”或者“+”,需要将特殊符号加上双引号当成字符串打印
cat /etc/passwd|awk -F":" '{print $1,$2}'
cat /etc/passwd|awk -F":" '{print $1":"$2}'
cat /etc/passwd|awk -F":" '{print $1"+"$2}'
打印磁盘已经使用情况,去除%,和首行
df|awk '{print $5}'|awk -F% '{print $1}'
取出文本中的ip地址及时间
cat test.txt |sed '2d'|awk -F"[[ ]" '{print $5,$1}'
取出文本中的主机并放回
cat 1.txt |awk -F "[.]" '{print $1}'>>1.txt //以.为分隔符取第一列
2.5.4 根据关键字提取所在行
根据关键字提取所在行提取/etc/passwd 以root开头的行
cat /etc/passwd |awk -F":" '/^root/{print}'
提取/etc/passwd root所在的行
cat /etc/passwd |awk -F: '/root/{print}'
提取/etc/passwd nologin结尾的行
cat /etc/passwd |awk -F":" '/nologin$/{print}'
提取/etc/passwd /sbin/nologin结尾的行
cat /etc/passwd |awk -F":"'/\/sbin\/nologin
$/{print}'
2.5.5 使用BEGIN输出包含指定字符的行并统计有多行
使用BEGIN输出包含指定字符的行并统计有多行
- BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;
- awk再处理指定的文本,之后再执行END模式中指定的动作;
- END{ } 语句块中,往往会放入打印结果等语句。
#先定义变量x,表示执行多少次
awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd
//{x=0}:定义变量x
/\/bin\/bash$/:查找以/bin/bash结尾的内容
{x++}:循环
END{print x}:结束打印次数
2.5.6FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同
FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同
awk -v FS=: '{print $1FS$3}' /etc/passwd
2.5.7NF:当前处理行的整行内容
当前处理的行的字段个数
cat /etc/passwd |awk -F: '{print NF}'
打印出每行最后一个字段
cat /etc/passwd |awk -F: '{print $NF}'
打印出每行倒数第二个字段
cat /etc/passwd |awk -F: '{print $(NF-1)}'
df|awk '{print $(NF-1)}'
2.5.8NR:当前处理行的行号
当前处理的行的行号
#NR写在后面则在后面显示行号
#awk -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
shutdown 7
halt 8
#可以用制表符
awk -F: '{print $1"\t"NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
#NR写在前面则在前面显示行号
awk -F: '{print NR"\t"$1}' /etc/passwd
1 root
2 bin
3 daemon
4 adm
5 lp
NR==n代表行号等于什么
awk -F: 'NR==2 {print $1}' /etc/passwd
NR%2==0取偶数行
awk -F: 'NR%2==0 {print $1}' /etc/passwd
awk -F: 'NR%2==1 {print $1}' /etc/passwd
NR1,NR4取区间行
awk -F: 'NR==1,NR==4 {print $1}' /etc/passwd
2.5.9RS:行分隔符。
awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
echo $PATH |awk -v RS=":" '{print $0}'
取UID数值范围$n>1000
#取uid大于1000的行
awk -F: '$3>1000 {print}' /etc/passwd
#取uid大于等于1000的行
awk -F: '$3>=1000 {print}' /etc/passwd
2.6试题练习
统计/etc/fstab文件中每个文件系统类型出现的次数
cat /etc/fstab |awk '/^[^#]/{print}'|awk '{print $3}'|sort |uniq -c
统计/etc/fstab文件中每个单词出现的次数
grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort|uniq -c|sort
将某日志文件访问用户的IP地址,在第三列冒号隔开,统计出访问量前十的IP地址
cat log.txt |awk -F: '{print $3}' |sort |uniq -c |sort -rn |head
提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
3、独孤求败sed
3.1sed基本介绍
3.1.1sed是什么
- sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
- sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要存储在一个命令文本文件中。
3.1.2sed编辑器的工作流程
sed 的工作流程主要包括读取、执行和显示三个过程:
- 读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
- 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出或者sed -i。
3.1.3sed命令的格式
第一种:
sed -e '操作' 文件1 文件2
第二种:
sed -n -e '操作' 文件1 文件2
第三种:
sed -f 脚本文件 文件1 文件2
第四种:
sed -i -e '操作' 文件1 文件2
3.2常用选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e ‘/^r/p’ -e’/^b/p’ /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件流
3.3常用操作
s替换指定字符
d删除选定的行
a增加,在下一行添加
i插入,在上一行添加
c替换,将选定行替换为指定内容
y字符转换,转换字符前后
p打印内容
=打印行号
l表示打印数据流的文本和不可打印的ascll
r扩展表达式
3.4使用实例
3.4.1打印内容
打印全部内容
sed ' ' #交互模式输入一行,自动打印一行相同的
sed -n ' ' #交互模式输入一行,关闭自动打印
sed -n ' p' #加上p又恢复自动打印,与sed ' '相同
查看文件,打印全部内容
sed ' ' /etc/fstab
sed -n ' p' /etc/fatab
打印指定行内容
sed -n '4p' /etc/fstab
#打印第四行内容
打印指定多行内容
ifconfig ens33 |sed -n '2,4p'
#打印网卡信息的2至4行
cat -n /etc/passwd |sed -n '2,+4p'
#打印第2至6行,即第二行开始往后四行
打印多行后退出
sed '3q' /etc/passwd
#打印三行后退出
打印最后一行,使用通配符$
sed -n '$p' /etc/passwd //打印最后一行
支持正则表达式,打印范围内容
sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
sed -n '/^r/,/^f/p' /etc/passwd
#以r开头 f开头结尾 第二轮以r开头 后面没有以f开头结尾 则显示全部
过滤关键字
sed -n '/root/p' /etc/passwd
#查找root关键字,并输出这一行
#,/关键字/p’ 从第#行开始匹配
sed -n '/root/,3p' /etc/passwd
打印文本的奇数和偶数行
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行
3.2删除内容
删除指定行
#删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
cat 1.txt |sed '3d'
#删除第三行并显示出来
删除指定的多行
sed '2,4d' seq.txt
#删除连续的2到4行
删除文本中的空行
sed '/^$/d' /opt/seq.txt
删除以指定字符结尾的行及取反
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
先备份内容再删除
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份
3.3插入内容
在指定行后插入
sed -i '3a 中部:正午' fsj.txt
#在第二行后插入内容
插入空行,修改文件的换行,要多加一个\
sed -i '5a\\n 天上人间' 1.txt
3.4替换行内容
替换某一行的具体内容
sed -i '2ctihuan' fsj.txt
#将第二行的内容替换成tihuan
3.5取反(使用感叹号!)
seq 10|sed -n '2!p'
#不显示第二行
3.6搜索替代
格式:格式:sed 行范围 s/旧字符串/新字符串/替换标记
替换标记:
数字:表明新字符串将替换第几处匹配的地方
g :表明新字符串将会替换所有匹配的地方
p : 打印与替换命令匹配的行,与 -n 一起使用
w 文件 :将替换的结果写到文件中
修改selinux开机不自启配置文件
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
修改多行,使用r 以及-e
sed -ri -e 's/SELINUX=disabled/SELINUX=enabled/' /etc/selinux/config -e 's/SELINUXTYPE=targeted/SELINUXTYPE=111/' /etc/selinux/config
修改全局,后面加g
sed -i 's/root/admin/g' /etc/passwd
#将全局出现的root修改为admin
查找几点到几点之间的日志
sed -n '/2023:08:09/,/2023:09:42:37/p' access_log
3.7分组调用
调用分组段
#分组使用()(),调用第一段使用\1
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/'
#调用第2个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/'
#调用所有分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2\3/'
提取IP地址
ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p'