文本处理:grep,sed,awk,tr,cut,sort,uniq,wc,rev

文本处理三剑客

grep命令->文本过滤工具;sed命令->文本过滤+修改; awk命令->文本过滤工具

链接:https://blog.csdn.net/qq_43072797/article/details/105832513

tr命令(实现sed命令的基础功能):

根据tr命令语法知:tr命令不支持直接读取文件,需要通过管道符"|";
tr命令:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。
tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
格式:#tr [OPTION]… SET1 [SET2]
[option]
-c: 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换。要求字符集为ASCII。
-s :删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
-d :删除字符串1中所有输入字符。
[SET字符集]:
指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。

  • [a-z] a-z内的字符组成的字符串。
  • [A-Z] A-Z内的字符组成的字符串。
  • [0-9] 数字串。

[:alnum:] :所有的字母与数字
[:alpha:] :所有字母字符
[:lower:] :所有小写字母
[:upper:] :所有大写字母
[:digit:] :所有数字
[:xdigit:] :所有 16 进位制的数字

[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:graph:] :所有可打印的字符(不包含空格符)
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
练习:

[root@centos7 test]#cat a.txt
rfawydahdowdi12310201akdnw
awdioWOIDJOIWJ21039QJWIO
888  77     77   771  2  awdji
   waiud  798  2
aaaaa    BBBB   
[root@centos7 test]#cat a.txt|tr -s " "   //将a.txt文本中的空格字符去重
rfawydahdowdi12310201akdnw
awdioWOIDJOIWJ21039QJWIO
888 77 77 771 2 awdji
 waiud 798 2
aaaaa BBBB 
[root@centos7 test]#cat a.txt|tr -d "a"  //删除a.txt文本中的字符“a”
rfwydhdowdi12310201kdnw
wdioWOIDJOIWJ21039QJWIO
888  77     77   771  2  wdji
   wiud  798  2
    BBBB   
[root@centos7 test]#cat a.txt|tr -c [:blank:] "L"  //除去空格字符,其余字符全部都替换为字符L。
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL  LL     LL   LLL  L  LLLLLL   LLLLL  LLL  LLLLLLL    LLLL   L
[root@centos7 test]#cat a.txt|tr "a-z" "A-Z"  //将a.txt文本中的小写字母,全部替换为大写字母。
RFAWYDAHDOWDI12310201AKDNW
AWDIOWOIDJOIWJ21039QJWIO
888  77     77   771  2  AWDJI
   WAIUD  798  2
AAAAA    BBBB   
[root@centos7 test]#cat a.txt|tr [:lower:] [:upper:]  //将a.txt文本中的小写字母,全部替换为大写字母。
RFAWYDAHDOWDI12310201AKDNW
AWDIOWOIDJOIWJ21039QJWIO
888  77     77   771  2  AWDJI
   WAIUD  798  2
AAAAA    BBBB   
[root@centos7 test]#cat a.txt|tr [:alnum:]  a  //将a.txt文本中的所有字母和数字都替换为字母a。
aaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaa
aaa  aa     aa   aaa  a  aaaaa
   aaaaa  aaa  a
aaaaa    aaaa   

cut命令:将行按指定分隔符进行分割

作用:将行按指定的分隔符分割成多列。它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的去重功能。
cut命令主要是接受三个定位方法:

  • 第一,字节(bytes),用选项-b
  • 第二,字符(characters),用选项-c
  • 第三,域(fields),用选项-f

注意:

  • 英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符(根据编码而定)。按字节或字符分割时将不能指定-d,因为-d是划分字段的。
  • cut分隔符必须是单个字符

格式:#cut OPTION… [FILE]…
[option]
-b:按字节筛选;
-n:与"-b"选项连用,表示禁止将字节分割开来操作;
-c:按字符筛选;
-d:指定字段分隔符,不写-d时的默认字段分隔符为"TAB";因此只能和"-f"选项一起使用。
-f:与-d仪器使用,以指定的分隔符为单位,选择显示的列号。
‘- -complement’:显示出去-f指定的列的其他列(即显示-f的补集)。
‘- -output-delimiter’:指定输出分割符;默认为输入分隔符。
实例:

[root@centos7 ~]#df -h|grep "^/dev/sd*" |tr -s " "
/dev/sda2 49G 2.9G 46G 6% /
/dev/sr0 8.8G 8.8G 0 100% /mnt/cdrom
/dev/sda3 40G 33M 40G 1% /data
/dev/sda1 497M 123M 375M 25% /boot

[root@centos7 ~]#df -h|grep "^/dev/sd*" |tr -s " " |cut -d" " -f1,3
/dev/sda2 2.9G
/dev/sr0 8.8G
/dev/sda3 33M
/dev/sda1 123M

[root@centos7 ~]#df -h|grep "^/dev/sd*" |tr -s " " |cut -d" " -f1,3  --complement   //以空格为分隔符,显示除1,3列的其他列
49G 46G 6% /
8.8G 0 100% /mnt/cdrom
40G 40G 1% /data
497M 375M 25% /boot

[root@centos7 ~]#df -h|grep "^/dev/sd*" |tr -s " "|cut  -b1 //显示第一个字节
/
/
/
/
[root@centos7 ~]#df -h|grep "^/dev/sd*" |tr -s " "|cut  -b1-10  //显示1-10字节。
/dev/sda2 
/dev/sr0 8
/dev/sda3 
/dev/sda1 

[root@centos7 ~]#df -h|grep "^/dev/sd*" |tr -s " "|cut  -b1-5,8-12 --output-delimiter=':'  //当显示多个字节段时,可用--output-delimiter指定输出分隔符。
/dev/:a2 49
/dev/:0 8.8
/dev/:a3 40
/dev/:a1 49

sort命令:排序

作用:用于将文本文件内容,以行为单位,加以排序。
sort 命令不加任何参数时,将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。
格式:
[option]:
-n: 将数值按照从小到大顺序排序。。
-r :以相反的顺序来排序。
-o <输出文件>:将排序后的结果存入指定的文件。
-t选项,后面可以设定间隔符。指定了间隔符之后,就可以用-k来指定列数了,然后按照指定的列数进行排序,默认是升序。
练习

[root@centos7 test]#cat a.txt 
a 1
g 7
p 6
d 2
w 3
m 4
6 9
[root@centos7 test]#sort a.txt  //将文本文件的第一列以ASCII 码的次序排列
6 9
a 1
d 2
g 7
m 4
p 6
w 3
[root@centos7 test]#sort -n a.txt //将文本按照数值从小到大进行排序
a 1
d 2
g 7
m 4
p 6
w 3
6 9
[root@centos7 test]#cat a.txt |sort  -nr //将a.txt文本按照数值从大到小排序。
6 9
w 3
p 6
m 4
g 7
d 2
a 1
[root@centos7 test]#cat a.txt |sort  -nr -o b.txt  //将a.txt文本按照数值从大到小排序后,存入b.txt文本中。

//以'-'为分隔符,将月份按数值排序
[root@localhost ~]# cat aa.txt 
2021-02-03
2025-03-05
2023-01-02
[root@localhost ~]# sort -t'-' -k2  aa.txt 
2023-01-02
2021-02-03
2025-03-05

uniq命令:统计/删除重复行

用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
uniq不加参数,默认是删除文本中重复的行。
当重复的行并不相邻时,uniq 命令是不起作用的,因此需与sort结合使用。
格式:#uniq [OPTION]… [INPUT [OUTPUT]]
[opion]
uniq不加参数,默认是删除文本中重复的行。
-i:删除文本中重复的行。
-c或–count :在每列旁边显示该行重复出现的次数。
-d或–repeated: 仅显示重复出现的行。
-u或–unique 仅显示不重复的行。
[输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
[输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
练习:

[root@centos7 test]#cat ip.txt 
192.168.1.1
192.168.2.3
10.22.23.1
209.222.30.2
192.168.1.1
192.168.1.1
[root@centos7 test]#cat ip.txt |uniq -c //当重复出现的行不相邻时,显示结果如下
      1 192.168.1.1
      1 192.168.2.3
      1 10.22.23.1
      1 209.222.30.2
      2 192.168.1.1

[root@centos7 test]#cat ip.txt |sort -n|uniq -c  //将ip.txt中的ipv4地址从小到大进行排序,并统计重复出现的次数。
      1 10.22.23.1
      3 192.168.1.1
      1 192.168.2.3
      1 209.222.30.2
[root@centos7 test]#cat ip.txt |sort -n|uniq -c|sort -nr //将ip.txt中的ipv4地址从小到大进行排序,并统计重复出现的次数,然后将重复出现的次数从大到小进行排序。
      3 192.168.1.1
      1 209.222.30.2
      1 192.168.2.3
      1 10.22.23.1
[root@centos7 test]#cat ip.txt |uniq -dc //仅显示重复的行,并统计重复出现的次数(X,需要先进行排序)
      2 192.168.1.1
[root@centos7 test]#cat ip.txt |sort -n|uniq -dc //仅显示重复的行,并统计重复出现的次数(√)
      3 192.168.1.1
[root@centos7 test]#cat ip.txt |sort -n|uniq -u //仅显示不重复的行。
10.22.23.1
192.168.2.3
209.222.30.2

wc命令:统计文件的行数、单词数和字节数

利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。
格式:#wc [option] file1…
[option]
-c或–bytes或–chars 只显示Bytes数,即字节数。
-l或–lines 只显示行数。
-w或–words 只显示单词数。
–help 在线帮助。
–version 显示版本信息。
练习:

[root@centos7 test]# wc testfile           # testfile文件的统计信息  
3 92 598 testfile       # testfile文件的行数为3、单词数92、字节数598 

[root@centos7 test]# wc testfile testfile_1 testfile_2  #统计三个文件的信息  
3 92 598 testfile                    #第一个文件行数为3、单词数92、字节数598  
9 18 78 testfile_1                   #第二个文件的行数为9、单词数18、字节数78  
3 6 32 testfile_2                    #第三个文件的行数为3、单词数6、字节数32  
15 116 708 总用量                    #三个文件总共的行数为15、单词数116、字节数708 

[root@centos7 test]#cat a.txt 
rfawydahdowdi12310201akdnw
awdioWOIDJOIWJ21039QJWIO
888  77     77   771  2  awdji
   waiud  798  2
aaaaa    BBBB   
[root@centos7 test]#cat a.txt |wc -c  //统计a.txt文本的字节数。
117
[root@centos7 test]#cat a.txt |wc -w  //统计a.txt文本中的单词数。
13
[root@centos7 test]#cat a.txt |wc -l  //统计a.txt文本的行数。
5

rev命令:文本内容反序输出

作用:将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。
例子:

[root@localhost ~]# cat aa.txt 
xz-devel-5.2.2-1.el7.i686.rpm
xz-devel-5.2.2-1.el7.x86_64.rpm
yum-plugin-remove-with-leaves-1.1.31-45.el7.noarch.rpm
yum-plugin-rpm-warm-cache-1.1.31-45.el7.noarch.rpm
zsh-5.0.2-28.el7.x86_64.rpm
zsh-html-5.0.2-28.el7.x86_64.rpm

[root@localhost ~]# rev aa.txt 
mpr.686i.7le.1-2.2.5-leved-zx
mpr.46_68x.7le.1-2.2.5-leved-zx
mpr.hcraon.7le.54-13.1.1-sevael-htiw-evomer-nigulp-muy
mpr.hcraon.7le.54-13.1.1-ehcac-mraw-mpr-nigulp-muy
mpr.46_68x.7le.82-2.0.5-hsz
mpr.46_68x.7le.82-2.0.5-lmth-hsz

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值