Linux 文本处理命令详解(tr cut sort uniq)

一、tr 命令

tr (translate) 命令可以对来自标准输入的字符进行替换、压缩和删除操作。

语法
1
tr [option] string1 string2
选项

tr string1 string2 :将标准输入中所有属于 string1 的字符替换为 string2 中的字符
-d :删除标准输入中所有属于 string1 的字符
-s :把标准输入中连续的重复字符压缩成一个字符显示
-c :取代或删除标准输入中所有不属于 string1 的字符

示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 替换指定字符
$ echo "hello world" | tr 'h' 'H'
Hello world

# 删除指定字符(数字和空格)
$ echo "hello 12345 world" | tr -d '0-9 '
helloworld

# 压缩指定字符
$ echo "heeeeeeeeello world" | tr -s 'e'
hello world

# 字符集补集
$ echo "hello 12345 world" | tr -c -d '0-9'
12345
字符集格式(string1 / string2)

字符集合(即命令参数中的 string1 和 string2)用于指定需要替换或删除的字符。'A-Za-z''A-F0-9''}.\t' 等都是合法的字符集合。

字符 含义
\b 退格符
\n 新行
\r 回车符
\t Tab 符
CHAR1-CHAR2 从 CHAR1 到 CHAR2 的所有字符(按 ASCII 字符顺序)
[:alnum:] 所有字母和数字
[:alpha:] 所有字母
[:blank:] 所有空格和 Tab 字符
[:cntrl:] 所有控制字符
[:graph:] 所有可打印字符,不包括空格
[:lower:] 所有小写字符
[:punct:] 所有标点符号
[:space:] 所有横向或纵向的空白字符
[:upper:] 所有大写字符

二、cut 命令

cut 命令用于切割并筛选文本行中的指定部分,其操作对象可以是一个或多个文件,如未指定文件选项或该选项为 “-“,则从标准输入中读取需要操作的内容。

语法

cut <option> list [file ...]
其中 list 选项为由逗号分隔的数字或 “-“ 号连接的数字范围,用于指定文本行中需要显示的字段。

  • N-:从第 N 个字节、字符、字段到结尾
  • N-M:从第 N 个字节、字符、字段到第 M 个(包括 M 在内)
  • -M:从第 1 个字节、字符、字段到第 M 个(包括 M 在内)
选项

-b list:list 选项指定的是 byte 的范围
-c list:list 选项指定的是字符的范围
-d:指定字段的分隔符,默认是 Tab
-f list:list 选项指定的是字段的范围

示例

用于演示的文件内容如下:

1
2
3
4
5
$ cat students.txt
No Name Mark
01 rose 69
02 jack 71
03 alex 68

使用 -f 选项提取指定字段

1
2
3
4
5
$ cut -f 2,3 students.txt
Name Mark
rose 69
jack 71
alex 68

使用 -d 选项指定字段分隔符

1
2
3
4
5
6
7
8
9
10
$ cat students2.txt
No,Name,Mark
01,rose,69
02,jack,71
03,alex,68
$ cut -f 2,3 -d "," students2.txt
Name,Mark
rose,69
jack,71
alex,68

使用 -c 选项提取指定字符范围里的内容

1
2
3
4
5
6
7
8
9
10
11
12
$ cat test.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
$ cut -c -5 test.txt
abcde
abcde
abcde
$ cut -c 5- test.txt
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz

三、sort 命令

sort 命令用于将文件内容进行排序,并将排序结果打印到标准输出。它将文件的每一行文本视为一个单位,从首字母向后,依次按该字母的 ASCII 码值进行比较,并按升序输出。

选项

-b:忽略每行行首的空格字符
-c:检查文件是否已按顺序排序
-d:排序时,只考虑字母、空格和数字,忽略其它字符
-f:排序时,将小写字母视为大写字母(即忽略大小写)
-i:排序时,忽略所有非打印字符
-M:将前面三个字母按月份的缩写进行排序
-n:按照数值的大小进行排序
-o:将排序好的结果输出到指定文件中
-r:以相反的顺序输出排序后的结果
-t:指定排序时使用的栏位分隔符
-u:合并显示内容相同的行

示例

用于演示的文件内容如下:

1
2
3
4
5
6
$ cat sort.txt
AAA:BB
aaa:4
ccc:10
bbb:20
bbb:8

简单排序

1
2
3
4
5
6
$ sort sort.txt
AAA:BB
aaa:4
bbb:20
bbb:8
ccc:10

按照 BB 列的数字由大到小排序

1
2
3
4
5
6
7
8
$ sort -nr -t: -k2 sort.txt
bbb:20
ccc:10
bbb:8
aaa:4
AAA:BB
# -n 表示按照数字大小排序,-r 表示反向排序
# -t: 表示冒号作为栏位分隔符,-k2 表示第二栏(即 BB 列)作为排序依据

四、uniq 命令

uniq 命令用于报告或过滤文件中内容重复的行

选项

-c:在每行输出内容的行首加上该行重复的次数
-d:仅显示内容重复的行
-u:仅显示内容未重复的行
-f:不比较指定的栏位
-s:不比较指定的字符

示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 源文件
$ cat uniq.txt
helloworld
helloworld
helloshell
hellotext

# 删除重复行
$ uniq uniq.txt
helloworld
helloshell
hellotext

# 只显示未重复的内容
$ uniq -u uniq.txt
helloshell
hellotext

# 统计各行出现的次数
$ uniq -c uniq.txt
2 helloworld
1 helloshell
1 hellotext
# 只显示重复行
$ uniq -d uniq.txt
helloworld