侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

绿泡泡:___zze,添加备注来意

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(10)之文本处理命令

zze
zze
2019-09-29 / 0 评论 / 0 点赞 / 673 阅读 / 5690 字

wc

wc 命令能够统计出指定文件内容的字节数、单词数、行数。
例:

[root@localhost ~]# wc /etc/passwd
 20  29 909 /etc/passwd

上述输出内容表示在 /etc/passwd 文件中有 20 行、29 个单词、909 个字节。

wc 命令是根据空白字符切割来统计单词。

如果只想显示行数,则可使用选项 -l,例:

[root@localhost ~]# wc -l /etc/passwd
20 /etc/passwd

如果只想显示单词数,则可使用选项 -w,例:

[root@localhost ~]# wc -w /etc/passwd
29 /etc/passwd

如果只想显示字节数,则可使用选项 -c,例:

[root@localhost ~]# wc -c /etc/passwd
909 /etc/passwd

cut

cut 命令可以将多行内容按指定字符分隔切割为多列,例:

[root@localhost ~]# cut -d: -f 1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
...

上述示例通过 -d 选项指定分隔符为 : 来切割 /etc/passwd 的内容,并且通过 -f 选项指定切割完成后仅显示第 1 列的内容。
还可同时输出多列内容,如:

[root@localhost ~]# cut -d: -f 1,3-5 /etc/passwd
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
sync:5:0:sync
shutdown:6:0:shutdown
...

在这里 -f 1,3-5 的含义是显示 /etc/passwd 内容按 : 分割后的 1、3、4、5 列的内容。
可以看到,默认输出的分隔符就是切割时指定的分隔符 :,可额外通过选项 --output-delimiter 手动指定输出时各列的分隔符,例:

[root@localhost ~]# cut -d: -f 1,3-5 --output-delimiter='-' /etc/passwd
root-0-0-root
bin-1-1-bin
daemon-2-2-daemon
adm-3-4-adm
lp-4-7-lp
sync-5-0-sync
shutdown-6-0-shutdown
...

sort

sort 命令的作用是用来排序,直接看示例:

[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
...

sort 命令默认的排序法则是比较每一行的第一个字符,按字母表中的顺序升序排序。

降序

可通过选项 -r 来降序排列,例:

[root@localhost ~]# sort -r /etc/passwd
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
root:x:0:0:root:/root:/bin/bash
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
...

忽略大小写

还可通过选项 -f 来指定忽略大小写排序,例:

[root@localhost ~]# sort -f /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
...

以指定字段排序

sort 同样具有切割文本的功能,可通过 -t 选项来指定分隔符,通过 -k 选项来指定以哪一列为标准进行排序,例:

[root@localhost ~]# sort -t: /etc/passwd -k3
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...

按数字大小进行排序

当排序字段是数字时,sort 命令并不是按照数字大小进行排序,而是按照数字在 ASCII 表中出现的顺序进行排序,但我们可以通过添加选项 -n 来指定按照数字大小进行排序,例:

[root@localhost ~]# sort -t: /etc/passwd -k3 -n
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
...

排序后去重

可通过指定 -u 选项让排序结果根据排序后的内容去重:

[root@localhost ~]# sort -t: /etc/passwd -k3 -n -u | cut -d: -f3
0
1
2
3
4
5
...

uniq

uniq 的作用就是就是去重。

连续且相同才算是重复。

看如下示例,将历史命令列表去重并显示,在使用 uniq 命令之前我们可以使用 sort -u 来去重看一下效果:

[root@localhost ~]# history | cut -d' ' -f5 | sort -u
cat
cut
echo
END
head
history
ifconfig
...

再来通过 uniq 命令去重做一下对比:

[root@localhost ~]# history | cut -d' ' -f5 | uniq
cat
ls
cat
ls
te
tee
ls
tee
...

可以看到,使用 uniq 命令去重后的结果依旧还是有重复,证明了对 uniq 命令而言连续且相同才算是重复。
所以其实可以先通过 sort 命令让相同的命令连续,然后通过 uniq 去重,就达到了 sort -u 的效果,例:

[root@localhost ~]# history | cut -d' ' -f5 | sort | uniq
cat
cut
echo
END
head
history
...

额。。为什么要这么九曲十八弯来使用 uniq 而不直接使用 sort -u 去重呢?因为 uniq 命令还具有 sort -u 不具备的功能,如通过 -c 选项统计出每一行内容重复的次数,例:

[root@localhost ~]# history | cut -d' ' -f5 | sort | uniq -c
      9 cat
      8 cut
      4 echo
      1 END
      6 head
     13 history
      1 ifconfig
...

还可通过 -d 选项筛选出重复过的行:

[root@localhost ~]# history | cut -d' ' -f5 | sort | uniq -d
cat
cut
echo
head
history
ip
...

-d 选项相反,-u 选项可以筛选出未曾重复出现过的行:

[root@localhost ~]# history | cut -d' ' -f5 | sort | uniq -u
ifconfig
rm
te
test
wd

练习

1、统计 ip addr 输出的内容有多少行。

[root@localhost ~]# ip addr | wc -l
16

2、取出 /etc/passwd 文件的第 6 至第 10 行,按第三个字段的数值大小逆序排序,输出各行的第一个字段。

[root@localhost ~]# sed -n '6,10p' /etc/passwd | sort -n -t: -k3 -r | cut -d: -f1
operator
mail
halt
shutdown
sync
0

评论区