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
评论区