文本处理三剑客

一:grep命令

grep用于查找符合条件和满足的正则表达式

语法格式:

grep 选项 匹配的条件 文本文件  

常用的选项

-n 对于匹配的内容显示行号
-v 反向选择(不要匹配到的内容)
-r 递归查找子目录中的文件中(符合条件的内容显示出来)
-c 只打印匹配的行数(符合条件的行数)
-i 忽略大小写
-l 只打印匹配的文件名(只打印出包含匹配的字符的文件名)
#搜索这个目录下包含11的文件名
[root@localhost opt]# grep -r -l 11 /opt/
/opt/qq.txt
/opt/ww.txt
[root@localhost opt]# 

#搜索不包含11的内容的行
[root@localhost opt]# cat qq.txt 
11
22
33
44

[root@localhost opt]# grep -v 11 /opt/qq.txt 
22
33
44

[root@localhost opt]# 

#搜索11所对应的行
[root@localhost opt]# grep -n 11 /opt/qq.txt 
1:11
[root@localhost opt]# 

 

  

二:sed命令

sed可以做关于文本的处理,就是添加,删除或者修改等操作

格式:

sed 选项  ‘选项处理条件’ 文本

 

常用的选项:

-e 只输出在屏幕上,原文件没有被修改
-f 就是将sed的动作写在一个档案内
-r 可以使用正则表达式
-i 直接修改读取的档案内容,不是输出在屏幕前
-n 就是指输出sed操作的行

选项处理条件的:

-a 在第一几行的下一行插入内容
-d 删除第几行的内容
-i 插入,就是在当前的一行的上面插入
-p 就是输出,一般与-n配合使用
-s 局部替换,就是替换一行中的某个字符, s/old/new/g
-c 全局替换,就是替换一行的所有内容

操作:

添加

[root@controller mnt]# cat 11.txt 
asd gdfg dfg gfdg fd
gdf gdf g fd g fdg dfg
g dfg df g df gdf
g dfg fd gfd
g fdg fd g
[root@controller mnt]# sed -i '1i\hhhhhh' 11.txt 
[root@controller mnt]# cat 11.txt 
hhhhhh
asd gdfg dfg gfdg fd
gdf gdf g fd g fdg dfg
g dfg df g df gdf
g dfg fd gfd
g fdg fd g
[root@controller mnt]# 

 

修改:

全局的修改

[root@controller mnt]# sed -i '1c\ggggg' 11.txt 
[root@controller mnt]# cat 11.txt 
ggggg
asd gdfg dfg gfdg fd
gdf gdf g fd g fdg dfg
g dfg df g df gdf
g dfg fd gfd
g fdg fd g
[root@controller mnt]# 

 

局部修改

[root@controller mnt]# sed -i 's/g/aaaa/g' 11.txt 
[root@controller mnt]# cat 11.txt 
aaaaaaaaaaaaaaaaaaaa
asd aaaadfaaaa dfaaaa aaaafdaaaa fd
aaaadf aaaadf aaaa fd aaaa fdaaaa dfaaaa
aaaa dfaaaa df aaaa df aaaadf
aaaa dfaaaa fd aaaafd
aaaa fdaaaa fd aaaa
[root@controller mnt]# 

 

打印

单独的使用的话
复制
[root@controller mnt]# sed -i '1p' 11.txt
[root@controller mnt]# cat 11.txt
asd aaaadfaaaa dfaaaa aaaafdaaaa fd
asd aaaadfaaaa dfaaaa aaaafdaaaa fd
aaaadf aaaadf aaaa fd aaaa fdaaaa dfaaaa
aaaa dfaaaa df aaaa df aaaadf
aaaa dfaaaa fd aaaafd
aaaa fdaaaa fd aaaa
[root@controller mnt]# 

与-n选项经常配合使用
[root@controller mnt]# sed -n '2p' 11.txt
asd aaaadfaaaa dfaaaa aaaafdaaaa fd
[root@controller mnt]# 

就是输出操作的行

 

删除  

[root@controller mnt]# sed -i '2d' 11.txt
[root@controller mnt]# cat 11.txt
asd aaaadfaaaa dfaaaa aaaafdaaaa fd
aaaadf aaaadf aaaa fd aaaa fdaaaa dfaaaa
aaaa dfaaaa df aaaa df aaaadf
aaaa dfaaaa fd aaaafd
aaaa fdaaaa fd aaaa
[root@controller mnt]# 

 

-f选项

就是可以将sed的动作写在一个脚本里面,这样方便了许多

[root@controller mnt]# cat 22 
s/a/llll/g
1a\hhhhhhhhh
[root@controller mnt]# 

[root@controller mnt]# sed -f 22 11.txt -i

-i这个选项使他生效
[root@controller mnt]# cat 11.txt
llllsd lllllllllllllllldfllllllllllllllll dfllllllllllllllll llllllllllllllllfdllllllllllllllll fd
hhhhhhhhh
lllllllllllllllldf lllllllllllllllldf llllllllllllllll fd llllllllllllllll fdllllllllllllllll dfllllllllllllllll
llllllllllllllll dfllllllllllllllll df llllllllllllllll df lllllllllllllllldf
llllllllllllllll dfllllllllllllllll fd llllllllllllllllfd
llllllllllllllll fdllllllllllllllll fd llllllllllllllll
[root@controller mnt]# 

  

 

  

 

  

  

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

三:awk命令

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

格式:

格式一:
awk options 'command' filename

格式二:
awk options -f script-file filenmae

 

选项

-F 以什么作为分割,分割字符会消失,然后前面是$1,后面是$2
 NF 字段个数(读取的列数) 
NR  记录行数(行号)从1开始 
 FS 就是以什么为分割字符 
 OFS 就是将分割的字符以什么来连接起来 
RS 就是以什么作为换行的记录(遇见什么换行)
ORS 就是将多个以什么连接起来

 

 

 

 

常见的awk内置变量

NF:就是读取每个字段的列数

NR:就是读取每一个行,并做一个记录

字段分割符:FS和OFS(默认是以空格或者tab键)

FS:就是以什么分割,

OFS:就是以什么作为一个连接,

 

记录分隔符:RS和ORS(默认是以换行为一个记录)

RS:就是将多个字段输出为多个字段然后换行,遇到什么就换行,

ORS:就是合并成一个字段,以什么来连接多个字段

$1,$2 都是分割之后才有的

/匹配鹅字段/

 

常见的列子:

没有模式时,相当于grep

[root@controller ~]# cat /etc/passwd|awk '/root/'
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@controller ~]# 

有模式时,就执行动作  

1)打印一行的哪个数 {print$1}

[root@localhost opt]# free -th
              total        used        free      shared  buff/cache   available
Mem:           1.9G        664M        808M         10M        511M        1.1G
Swap:          4.0G          0B        4.0G
Total:         5.9G        664M        4.8G
[root@localhost opt]# free -th | grep Total | awk '{print$1}'
Total:
[root@localhost opt]# 

2)打印一行的所有内容

[root@localhost opt]# free -th | grep Total | awk '{print$0}'
Total:         5.9G        666M        4.8G
[root@localhost opt]# 

3)以a为分割,打印$1

[root@localhost opt]# cat 11.txt 
sdfsdfgasdgafgdf
[root@localhost opt]# awk -F 'a' '{print$1}' 11.txt 
sdfsdfg
[root@localhost opt]# 


#打印$2
[root@localhost opt]# awk -F 'a' '{print$2}' 11.txt 
sdg
[root@localhost opt]# 

#打印$3
[root@localhost opt]# awk -F 'a' '{print$3}' 11.txt 
fgdf
[root@localhost opt]# 

4)NF的列子

#读取有多少列
[root@localhost opt]# cat ww.txt 
das dasd dasd dasd
da da
fsd fsdf fsdf 
da
[root@localhost opt]# awk '{print NF}' ww.txt 
4
2
3
1
[root@localhost opt]# 

5)$NF(就是打印最后一列)

[root@localhost opt]# awk '{print $NF}' ww.txt 
dasd
da
fsdf
da
[root@localhost opt]# cat ww.txt 
das dasd dasd dasd
da da
fsd fsdf fsdf 
da
[root@localhost opt]# 

 

NR:就是关于记录行号

[root@controller mnt]# awk '{print "行数",NR}' 11.txt 
行数 1
行数 2
行数 3
行数 4
行数 5
行数 6
[root@controller mnt]# 

 

FNR:就是处理多个文本的时候,有作用。对处理另外的一个文本的时候,从头开始计数

[root@controller mnt]# awk '{print "行数",FNR}' passwd 11.txt 
行数 1
行数 2
行数 3
行数 4
行数 5
行数 6
行数 7
行数 8
行数 9
行数 10
行数 1
行数 2
行数 3
行数 4
行数 5
行数 6
[root@controller mnt]# 

  

6:FS和OFS的操作

FS

#使用FS这个变量,就是以:这个未分割
[root@controller mnt]# awk 'BEGIN{FS=":"}{print $1,$2}' /mnt/passwd 
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
[root@controller mnt]#  

  

OFS,就是以+作为连接,就是在空格或者换行的那里

[root@controller mnt]# awk 'BEGIN{OFS="+"} {print $1,$2}' /mnt/passwd 
root:x:0:0:root:/root:/bin/bash+
bin:x:1:1:bin:/bin:/sbin/nologin+
daemon:x:2:2:daemon:/sbin:/sbin/nologin+
adm:x:3:4:adm:/var/adm:/sbin/nologin+
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin+
sync:x:5:0:sync:/sbin:/bin/sync+
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown+
halt:x:7:0:halt:/sbin:/sbin/halt+
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin+
operator:x:11:0:operator:/root:/sbin/nologin+
[root@controller mnt]# 

FS和OFS的配合使用,

因为,FS和OFS都是默认使用空格或者tab键,

让:这个为分割,这个+作为连接的符号,如果没有的设定分割符的话,默认使用空格或者tab键

[root@controller mnt]# awk 'BEGIN{OFS="+";FS=":"} {print $1,$2}' passwd 
root+x
bin+x
daemon+x
adm+x
lp+x
sync+x
shutdown+x
halt+x
mail+x
operator+x
[root@controller mnt]# 

7:RS和ORS的操作

默认是以换行或者回车作为记录的,以行为记录的,而不是以字段为记录的

ORS就是

将多行以空格连接在一起了,

[root@controller mnt]# awk 'BEGIN{ORS=" "} {print $0}' passwd 
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@controller mnt]# 

 

RS,就是以什么为分割,作为一行

[root@controller mnt]# awk 'BEGIN{RS=":"} {print $0}' passwd 
root
x
0
0
root
/root
/bin/bash  

RS和ORS的综合使用

[root@controller mnt]# awk 'BEGIN{RS=":";ORS=" "} {print $0}' passwd 
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /sbin/nologin
daemon x 2 2 daemon /sbin /sbin/nologin
adm x 3 4 adm /var/adm /sbin/nologin
lp x 4 7 lp /var/spool/lpd /sbin/nologin
sync x 5 0 sync /sbin /bin/sync
shutdown x 6 0 shutdown /sbin /sbin/shutdown
halt x 7 0 halt /sbin /sbin/halt
mail x 8 12 mail /var/spool/mail /sbin/nologin
operator x 11 0 operator /root /sbin/nologin
 [root@controller mnt]# 

  

  

  

  

  

  

  

 

 

  

 

posted @ 2023-11-06 22:54  q_7  阅读(10)  评论(0编辑  收藏  举报