**
sed:全名叫 stream editor即流编辑器,
与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。
默认不支持扩展表达式,加-r 选项开启 ERE。如果不加-r 使用花括号要加转义符{}
说明: 注意sed软件以及后面选项,sed命令和输入文件,每个元素之间都至少有一个空格。
sed -commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令
sed -commands 既可以是单个sed命令,也可以是多个sed命令组合。
input -file (输入文件)是可选项,sed还能够从标准输入如管道获取输入。
sed的工作原理
sed读取一行,首先将这行放入到缓存中,然后,才对这行进行处理,处理完成以后,将缓冲区的内容发送到终端。存储sed读取到的内容的缓存区空间称之为:模式空间(Pattern Space)
选项
-n(no):取消默认的sed软件的输出,常与sed命令的p连用。
-e(entry):一行命令语句可以执行多条sed命令
-r(ruguler):使用扩展正则表达式,默认情况sed只识别基本正则表达式
-i(inside):直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件*
sed命令:
sed [选项] [sed命令] [输入文件]*
a (append):追加,在指定行后添加一行或多行文本
c (change):取代指定的行
d (delete):删除指定的行
i (insert):插入,在指定行前添加一行或多行文本
p (print):打印模式空间内容,通常p会与选项-n一起使用
特殊符号
!:对指定行以外的所有行应用命令(取反)
增加
2个sed命令,分别是:
“a”: apend,追加,追加文本到指定行后。
“I”: insert,插入,插入文本到指定行前。
例:在第一行后面追加3行,不加-i不改变源文件
[root@localhost ~]# sed “1a 1\n2\n3\n” test
root❌0:0:root:/root:/bin/bash
1
2
3
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
2.删除
这个功能也是非常得有用,比如我们想删除文件中的某些行,以前最常用的是vi或vim命令,但现在我们知道了sed命令,就应该使用这个高逼格的命令完成任务了。
“d”:delete,删除,删除文本。
例:从第1行起删除1行
[root@localhost ~]# sed “1d” test
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
3.改
“c”:用新行取代旧行,记忆方法:c的全拼是change,意思是替换。
例:将第一行替换为 this is zxj
[root@localhost ~]# sed ‘1c this is zxj’ test
this is zxj
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
4.文本替换
使用sed软件80%的场景是使用替换功能
选项:
“s”:单独使用–>将每一行中第一处匹配的字符串进行替换==>sed命令
“g”:每一行进行全部替换–>sed命令s的替换标志之一(全局替换),非sed命令。
“-i”:修改文件内容–>sed软件的选项,注意和sed命令i区别。
例:将root替换为zxj
[root@localhost ~]# sed ‘s/root/zxj/’ test
zxj❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
#将所有的root替换为zxj
[root@localhost ~]# sed ‘s/root/zxj/g’ test
zxj❌0:0:zxj:/zxj:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
5.查
这个功能也是非常得有用,比如我们想查看文件中的某些行,以前最常用的是cat或more或less命令等,但这些命令有些缺点,就是不能查看指定的行。而我们用了很久的sed命令就有了这个功能了。而且我们前面也说过使用sed比其他命令vim等读取速度更快!
这里我们需要用到1个sed命令
“p”: print,打印,输出指定内容,但默认会输出2次匹配的结果,因此使用-n选项取消默认输出。
例:显示第2行(包括模式空间文件)
[root@localhost ~]# sed ‘2p’ test
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
#-n与p连用,不显示缓存文件,只显示第2行
[root@localhost ~]# sed -n ‘2p’ test
bin❌1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#
6.取反操作
显示非1-3行
# sed -n ‘1,3!p’ passwd
awk:awk是一个强大的文本分析工具,
***1.解释:***
相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk指令是由模式,动作,或者模式和动作的组合组成。
模式既pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把他理解为一个条件。
动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。比如awk使用格式:
awk处理的内容可以来自标准输入(<),一个或多个文本文件或管道。
2.awk参数
-F:指定分隔符
3. 部分概念
记录(record):一行就是一个记录
分隔符(field separator):进行对记录进行切割的时候所使用的字符
字段(field):将一条记录分割成的每一段
FILENAME:当前处理文件的文件名
FS(Field Separator):字段分隔符(默认是以空格为分隔符)
NR(Number of Rrecord):行号,记录的编号(awk每读取一行,NR就加1)
NF(Number of Field):字段数量(记录了当前这条记录包含多少个字段)
ORS(Output Record Separator):指定输出记录分隔符(指定在输出结果中记录末尾是什么,默认是\n,也就是换行)
OFS(Output Field Separator):输出字段分隔符
RS:记录分隔符
4.输出字段的表达方式
n
输
出
一
个
指
定
的
字
段
n 输出一个指定的字段
n输出一个指定的字段 NF 输出最后一个字段
$0 输出整条记录
例:#只打印2和4行
[root@localhost ~]# cat test | awk ‘NR2||NR4{print $0}’
root❌0:0:root:/root:/bin/bash
adm❌3:4:adm:/var/adm:/sbin/nologin
[root@localhost ~]# cat test | awk ‘NR2||NR4{print NR,$0}’ #带行号
2 root❌0:0:root:/root:/bin/bash
4 adm❌3:4:adm:/var/adm:/sbin/nologin
## 只打印第二行
[root@localhost ~]# cat test | awk 'NR2{print $0}’
#找谁,要干什么;找到第2行,找到后将第2行整段打印出来。注意是而不是=
root❌0:0:root:/root:/bin/bash
取出网卡ip
#方法一:
[root@localhost ~]# ip a | grep ‘global’ #取出该行
inet 192.168.16.5/24 brd 192.168.16.255 scope global ens33
[root@localhost ~]# ip a | grep ‘global’ | awk -F " " ‘{print $2}’
192.168.16.5/24 #空格分割取出ip段
[root@localhost ~]# ip a | grep ‘global’ | awk -F " " ‘{print $2}’ | awk -F “/” ‘{print $1}’ # /分割取出ip
192.168.16.5
#方法二:
[root@localhost ~]# ip a | grep “global” | awk -F “( +)|(/)” ‘{print $3}’ #分组,以空格和/分割的第三部分
192.168.16.5
5…awk特殊模式—BEGIN模式和END模式
BEGIN模块在awk读取文件之前就执行,一般用来定义我们的内置变量(预定义变量,eg:FS,RS)
需要注意的是BEGIN模式后面要接跟一个action操作块,包含在大括号内。awk必须在输入文件进行任何处理前先执行BEGIN里的动作(action)。可以不要任何输入文件,就可以对BEGIN模块进行测试,因为awk需要先执行完BEGIN模式,才对输入文件做处理。BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS等值。
1)BEGIN
[root@localhost ~]# cat test | awk -F “:” ‘BEGIN{print"userinfor,shelltype"}{print
1
,
1,
1,NF}’
userinfor,shelltype #先执行BEGIN模块,再执行awk读取文件
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
2)END作用与BEGIN相反
END在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结果(累加,数组结果),也可以是和BEGIN模块类似的结尾标识信息
与BEGIN模式相对应的END模式,格式一样,但是END模式仅在awk处理完所有输入行后才进行处理。
[root@localhost ~]# cat test | awk -F “:” ‘{print $1,$7}END{print “end of file”}’
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
end of file #执行完awk后再打印end of file
grep默认不支持扩展表达式,加-E 选项开启 ERE。如果不加-E 使用花括号要加转义符{}
1.grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。
2.格式命令:
grep 匹配条件 处理文件名称
grep root passwd ##过滤root关键字所在的行
grep -i root passwd ##忽略大小写过滤root关键字所在的行
grep -E “<root” passwd ##过滤root字符之前没有字符的行
grep -E “root>” passwd ##过滤root字符之后没有字符的行
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A数字 ##显示过滤行以及下面几行
grep -B数字 ##显示过滤行以及上面几行
grep -v ##反向过滤
3.grep命令字符数量匹配规则
^westos: 以westos关键字开头
westos$: 以westos结尾
w…s :w开头s结尾中间含有3个任意字符
…s :s结尾前面有3个任意字符
- :字符出现次数任意(即0次到任意次)
? :字符出现0到1次
- :字符出现1次到任意次
{n} :字符出现n次
{m,n} :字符出现m到n次
{,n} :字符出现0到n次
{m,} :字符最少出现m次