Linux文本处理工具【tr、cut、sort、uniq】

509 阅读5分钟

1. tr 命令——替换、压缩、删除

tr (Text Replacer) 命令常用来对来自标准输入的字符进行替换、压缩和删除。

命令格式 :tr [选项]... SET1 [SET2]

(SET 是一组字符串,一般都可按照字面含义理解)

选项:

  • -d 删除
  • -s 压缩
[root@node1 ~]#  tr 1 a    //遇到1换成a
111
aaa
123
a23

[root@node1 ~]#  tr -d 1  //把1删除
111

123
23

[root@node1 ~]#  tr -s 1  //压缩连续的1
111
1
123
123 
1123
123

[root@node1 ~]#  tr -s " "  //压缩连续的空格
1           2
1 2
12        3
12 3
    
[root@node1 ~]#  tr '[a-z]' '[A-Z]'   //将所有小写字母替换为大写
abc
ABC



`cat file | tr [选项] 参数`

生成随机密码:
cat /dev/urandom |tr -dc '[:alnum:]' |head -c12

2. cut命令——切列

cut 命令可以提取文本文件数据的指定列。

命令格式 : cut [选项]... [文件]...

选项:

  • -d 指明分隔符
  • -f 想要获取的字段
    • #: 第#个字段,例如 3
    • #,#[,#]:离散的多个字段,例如 1,3,6
    • #-#:连续的多个字段, 例如 1-6
[root@node1 ~]#  cut -d: -f1,3 /etc/passwd |head  //以冒号作为分隔的条件,取文件的第1列和第3列
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11


`cat file | cut [选项] 参数`

注意!不能将连续的字符当作分隔符

[root@node1 ~]#  df
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/mapper/centos-root 40137576 4841480 35296096   13% /
devtmpfs                  917604       0   917604    0% /dev
tmpfs                     933524       0   933524    0% /dev/shm
tmpfs                     933524   17436   916088    2% /run
tmpfs                     933524       0   933524    0% /sys/fs/cgroup
/dev/mapper/centos-home 19593216   36968 19556248    1% /home
/dev/sda1                1038336  182368   855968   18% /boot
tmpfs                     186708      32   186676    1% /run/user/0
/dev/sr0                 4414592 4414592        0  100% /run/media/root/CentOS 7 x86_64

[root@node1 ~]#  df |cut -d" " -f1,5  //以空格为分隔符,取第1和第5列
文件系统 
/dev/mapper/centos-root 
devtmpfs 
tmpfs 
tmpfs 
tmpfs 
/dev/mapper/centos-home 36968
/dev/sda1 
tmpfs 
/dev/sr0            //内容错误,因为有连续的空格,不能将连续的字符当作分隔符!

[root@node1 ~]#  df |tr -s " " |cut -d" " -f1,5    //先将空行压缩成一个,再提取
文件系统 已用%
/dev/mapper/centos-root 13%
devtmpfs 0%
tmpfs 0%
tmpfs 2%
tmpfs 0%
/dev/mapper/centos-home 1%
/dev/sda1 18%
tmpfs 1%
/dev/sr0 100%


[root@node1 ~]#  df |tail -n +2|tr -s " " |cut -d " " -f5|tr -d %   //去除百分号,对比数字
13
0
0
2
0
1
18
1
100

3. sort命令——排序

把整理过的文本显示在屏幕上,不改变原始文件。sort将文件的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码进行比较,最后将它们按升序输出。

命令格式 : sort [options] file(s)

选项:

  • -n 按照数字大小进行排序(默认升序)
  • -r 倒序排序
  • -k 指定列
  • -t 指定分隔符
[root@node1 ~]#  cat /etc/passwd |head
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@node1 ~]#  cat /etc/passwd |head |cut -d: -f3 |sort -nr   //以冒号为分隔符,取第三列,并按数字大小倒序排序
11
8
7
6
5
4
3
2
1
0


`cat file | sort 选项`

4. uniq命令——去重

uniq(unique 唯一)是一个用于文本处理中删除重复行的工具(只能将连续的重去掉),常与sort命令结合使用。

命令格式 : uniq [OPTION]... [FILE]...

选项:

  • -c 显示每行重复出现的次数
  • -u 仅显示不曾重复的行
  • -d 仅显示重复过的行
[root@node1 ~]#  cat 123 
1
0
1
1
2
2
3
3
3
4
[root@node1 ~]#  cat 123 |uniq   //去重
1
0
1
2
3
4
[root@node1 ~]#  cat 123 |uniq -c  //显示每行重复出现的次数
      1 1
      1 0
      2 1
      2 2
      3 3
      1 4
[root@node1 ~]#  cat 123 |uniq -u  //仅显示不曾重复的行
1
0
4
[root@node1 ~]#  cat 123 |uniq -d  //仅显示重复过的行
1
2
3


`cat file | uniq 选项`
`面试题:`查看访问日志,找出访问前10名的用户
cat  access_log  |cut  -d  “  ”  -f1 |sort  -n |uniq  -c |sort  -nr |head

[root@localhost ~]# cat access_log|cut -d" " -f1     //先取地址
[root@localhost ~]# cat access_log|cut -d" " -f1|sort  //再排序一样的ip地址在一起
[root@localhost ~]# cat access_log|cut -d" " -f1|sort|uniq -c  //去重
[root@localhost ~]# cat access_log|cut -d" " -f1|sort|uniq -c|sort -nr |head  //再数字排序,取前10行

5. seq命令

seq命令是 sequence 的缩写,用于打印数字序列。

[root@node1 ~]#  seq 6
1
2
3
4
5
6
[root@node1 ~]#  seq -s+ 6
1+2+3+4+5+6
[root@node1 ~]#  seq -s+ 6 |bc  //求1-6的和,bc是计算命令
21