几个文本处理的小工具:tr ,wc,cut,sort,uniq

 1. tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

 

语法:tr 选项  SET1 SET2 

-c或——complerment:取代所有不属于第一字符集的字符(就是补集);

-d或——delete:删除所有属于第一字符集的字符;

-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;

-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。

 

参数

 

字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数

字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;

字符集2:指定要转换成的目标字符集。

示例:

处理字符串“xt.,l 1jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格

 

[root@centos7 testdir]#echo "xt.,l 1 jr#all.logmn2 c*/fe3 uz4" | tr -c -d[[:digit:]][[:space:]]

 1 2 3 4


上面命令执行结果就是除了空格和数字留下了

(也可以echo 'xt.,l 1 jr#!$mn2 c*/fe3uz4' |tr -d  [[:alpha:]][[:punct:]])没有前面方法好,注:alpha为字母集punct为标点符号集,digit为数字集,也可以直接在单引号中直接指定符号或数字等如:tr 'A-Z' 'a-z'

 

2. wc字符统计

 

语法:

wc(选项)(参数)

 

选项

-c或--bytes或——chars:只显示Bytes数;

-l或——lines:只显示列数;

-w或——words:只显示字数。

 

示例:

[root@centos7 ~]#wc -c /etc/issue

23 /etc/issue

[root@centos7 ~]#wc -l /etc/issue

3 /etc/issue


 

3. cut用来显示行中的指定部分,删除文件中指定字段。

 

语法:

    cut(选项)(参数)

选项

-b:仅显示行中指定直接范围的内容;

-c:仅显示行中指定范围的字符;

-d:指定字段的分隔符,默认的字段分隔符为“TAB”;

-f:显示指定字段的内容;

-n:与“-b”选项连用,不分割多字节字符;

--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
--complement补足被选择的字节、字符或字段;(就是补集的意思与-f使用)

示例:

[root@centos7 testdir]# cat test.file

jack:x:1000:1000:jack_cui:/home/jack:/bin/bash

apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

gentoo:x:1001:1001:GentooDistribution:/home/gentoo:/bin/csh

natasha:x:1002:1003::/home/natasha:/bin/bash

[root@centos7testdir]# cut -d: -f2-3 test.file 

x:1000

x:48

x:1001

x:1002


显示每一行的第三个字符:

[root@centos7 testdir]# cut  -c3 test.file 

c
a
n
t


显示除了第3-7段之外的其它端(即显示前两段)长选项指定了规定显示的补集-d制定了段与端之间的分隔符,否则默认是空格为分隔符

[root@centos7 testdir]# cut --complement -d: -f3-7test.file 

jack:x

apache:x

gentoo:x

natasha:x


 

4. sort:对文本行进行排序,并将结果进行标准输出:

语法:

sort(选项)(参数)

选项

-b:忽略每行前面开始出的空格字符;

-c:检查文件是否已经按照顺序排序;

-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;

-f:排序时,将小写字母视为大写字母;

-i:排序时,除了040176之间的ASCII字符外,忽略其他的字符;

-m:将几个排序号的文件进行合并;

-M:将前面3个字母依照月份的缩写进行排序;

-n:依照数值的大小排序; -o<输出文件>:将排序后的结果存入制定的文件;

-r:以相反的顺序来排序;

-t<分隔字符>:指定排序时所用的栏位分隔字符;


示例:

 

[root@centos7 testdir]# cat b.test

jack:x:1000

apache:x:48

gentoo:x:1001

ben:x:599

rose:x:1

natasha:23:x

mike:x:1002

[root@centos7 testdir]# sort  -n -k3.1,3.2 -t: b.test 

natasha:23:x

rose:x:1

gentoo:x:1001

jack:x:1000

mike:x:1002

apache:x:48

ben:x:599


注:上一个示例中-n表示只以数字的方式,否则默认以ascii码大小来排序,-k表示以第三栏的第一个到第二个数字来排序否则默认以从指定的栏到行结束,-t表示分隔符为:

 

5. uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。

语法

uniq(选项)(参数)

选项

-c——count:在每列旁边显示该行重复出现的次数;

-d--repeated:仅显示重复出现的行列;

-f<栏位>--skip-fields=<栏位>:忽略比较指定的栏位;

-s<字符位置>--skip-chars=<字符位置>:忽略比较指定的字符;

-u——unique:仅显示出一次的行列;

-w<字符位置>--check-chars=<字符位置>:指定要比较的字符。

 

参数

输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据;

输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

测试文本:

[root@centos7 testdir]# cat uniq.test 

this is upiq test line 1

this is upiq test line 2

this is upiq test line 3

this is upiq test line 3

this is upiq test line 2

this is upiq test line 1

this is upiq test line 4


1)仅显示连续重复过的行,因为前面数据流已经经过sort排序,所以一样的行将连续,否则仅执行后面的行将仅显示line 3

[root@centos7 testdir]# sort uniq.test |uniq –d 

this is upiq test line 1

this is upiq test line 2

this is upiq test line 3


2)仅显示出现一次的行,这里也需要排序,uniq统计时也是连续的两行做比较,不是全文比较,所以需要把相同的行先排序到一起,然后进行统计

 

[root@centos7 testdir]# sort uniq.test |uniq –u  

this is upiq test line 4