文本处理三剑客
一: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]#