Linux命令之sort uniq wc tr
文章目录
sort 命令
Linux sort命令用于将文本文件内容加以排序。
sort可针对文本文件的内容,以行为单位来排序。
语法:
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。
参数说明:
-n 依照数值的大小排序
sort -n file.txt #对文件第一个字符进行排序,默认从小到大
-r 以相反的顺序来排序
sort -n -r file.txt #对排序结果进行反转,从大到小排序
-u 意味着是唯一的(unique),输出的结果是去完重了的
sort -u file.txt #对排序结果去重
-t <分隔字符> 指定排序时所用的栏位分隔字符
-k 根据-t分隔区域后,选定区域用于排序
sort -n -t "." -k 4 ip.txt #指定分隔符号,指定区域进行排序,从小到大
比如有存储的IP地址列表需要排序:
10.0.0.1
10.0.0.22
10.0.0.4
10.0.0.35
10.0.0.211
这个地方需要加上-n 参数 指定数值大小排序,不然会根据-k 4区域的第一个char(字符)进行排序
uniq 命令
Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用
uniq 可检查文本文件中重复出现的行列
语法:
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
参数:
-c,--count 在每列旁边显示该行重复出现的次数。
-d,--repeated 仅显示重复出现的行列。
-u,--unique 仅显示出一次的行。unique的只出现过一次,时针对-c统计之后的结果
实例:
文件testfile中第 2、3、5、6、7、9行为相同的行,使用 uniq 命令删除重复的行:
uniq testfile #仅能去重连续的重复行
结合sort使用,可以去重不连续的重复行
sort -n testfile |uniq #排序后去重,可以实现精准去重
在精准去重的基础上,统计重复行出现的次数,在行首计数
sort -n testfile |uniq -c #统计每一行的重复次数
只显示文件中的重复行,并计数
sort -n testfile |uniq -c -d #筛选去除行计数为1的行
只显示文件中的未重复行,也就是说行首计数为1的行
sort -n testfile |uniq -c -u #只显示行首计数为1的行
wc 命令
Linux wc命令用于计算字数
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
语法:
wc [-clw][--help][--version][文件...]
参数:
-c,--bytes 只显示Bytes数
-m,--chars 打印字符数
-l,--lines 打印行数
-L,--max-line-length 打印最长行的长度
-w,--words 打印单词数
实例:
在默认的情况下,wc将计算指定文件的行数、字数,以及字节数:
wc testfile
使用 wc统计,结果如下:
$ wc testfile # testfile文件的统计信息
3 92 598 testfile # testfile文件的行数为3、单词数92、字节数598
其中,3 个数字分别表示testfile文件的行数、单词数,以及该文件的字节数。
wc -l #统计文件的行数
wc -w #统计单词的数量
[root@wwk code]# echo "wwk is rich and cool" |wc -w
5
wc -m #统计字符数量
[root@wwk code]# echo "wang" |wc -m
5
这里的wang字符是4个,为什么会被统计成5个呢,因为字符串结尾有个$符(行结束符)
[root@wwk code]# echo "wang" |cat -E
wang$
wc -L #输出最长行的字符数
cat XXX.txt |wc -L
tr 命令
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
语法:
tr [-cdst][--help][--version][第一字符集][第二字符集]
tr [OPTION]…SET1[SET2]
参数说明:
-c, --complement: 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换(取代所有属于第一字符集的字符)
-d, --delete: 删除指令字符(删除所有属于第一字符集的字符)
-s, --squeeze-repeats: 缩减连续重复的字符成指定的单个字符(把连续重复的字符以单独一个字符表示)
-t, --truncate-set1: 削减 SET1 指定范围,使之与 SET2 设定长度相等(先删除第一字符集较第二字符集多出来的字符)
字符集合的范围:
\NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
\\ 反斜杠
\a Ctrl-G 铃声
\b Ctrl-H 退格符
\f Ctrl-L 走行换页
\n Ctrl-J 新行
\r Ctrl-M 回车
\t Ctrl-I tab键
\v Ctrl-X 水平制表符
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
[CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
[:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有数字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小写字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
[:upper:] :所有大写字母
[:xdigit:] :所有 16 进位制的数字
[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
实例:
将文件testfile中的小写字母全部转换成大写字母,此时,可使用如下命令:
cat testfile |tr a-z A-Z
大小写转换,也可以通过[:lower][:upper]参数来实现。例如使用如下命令:
cat testfile |tr [:lower:] [:upper:]
使用-d删除参数
[root@wwk ~]# echo "my name is wwk, i have 12345 gold" |tr -d 'a-z'
, 12345
[root@wwk ~]# echo "my name is wwk, i have 12345 gold" |tr -d 'a,i'
my nme s wwk hve 12345 gold
[root@wwk ~]# echo "my name is wwk, i have 12345 gold" |tr -d '1-9'
my name is wwk, i have gold
把文件作为标准输入,进行字符替换
[root@wwk ~]# cat text.txt
my name is wwk
i like money very much
[root@wwk ~]# tr 'w' 'W' < text.txt
my name is WWk
i like money very much
使用-s参数去除连续的重复字符
[root@wwk ~]# echo "iiiiii aaaammmm ccccoooo" |tr -s 'iamco'
i am co