sort命令的使用场景就是对输入数据按某列的值进行升序或降序排序。
sort命令常用的命令选项有:
- -h: 英文human-readable的首字母。指把列值按人类可读的方式进行排序。
- -n: 英文numeric的首字母。指把列值转换为数字后再进行排序。
- -r: 英文reverse的首字母。使用-r则降序排序输入数据,不使用-r则默认升序排序输入数据。
- -k: 英文key的首字母。k1指按第1列的值排序输入数据,k2指按第2列的值排序输入数据,k3指按第3列的值排序输入数据,以此类推。如果不使用-k选项指定按第几列(字段、键)的值排序,则默认按第一列的值排序输入数据。
例子1: -n与-h的区别;不使用-k则默认按第一列的值进行排序
root@hgdm:~# bash -c 'du -sh /* | sort -hr | head -n 10' 2>/dev/null
4.1G /var
3.0G /usr
948M /swapfile
381M /data
138M /boot
104M /root
6.5M /etc
2.6M /home
692K /run
64K /tmp
# 通过眼睛观察到,4.1G的/var目录没有排在最前面,这样的结果不符合预期
root@hgdm:~# bash -c 'du -sh /* | sort -nr | head -n 10' 2>/dev/null
948M /swapfile
692K /run
381M /data
138M /boot
104M /root
64K /tmp
16K /lost+found
12K /media
6.5M /etc
4.1G /var
# 若要让sort -nr输出符合预期的结果,就要改变输入数据,把du -sh改为du -s
root@hgdm:~# bash -c 'du -s /* | sort -nr | head -n 10' 2>/dev/null
4196744 /var
3088028 /usr
969976 /swapfile
389216 /data
140876 /boot
106084 /root
6616 /etc
2576 /home
692 /run
64 /tmp
例子2:使用-k指定按第几列的值进行排序
# 使用下面的命令查一下ps aux的标题行
root@hgdm:~# ps aux | head -n 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# grep -v '%CPU'表示不包含或过滤掉%CPU所在的行
# sort -nr -k3指按第三列(即CPU那一列)的值的数字进行降序排序
# awk '{ print $1,$2,$3,$4 }'指只输出第1列的值(USER列,即用户或属主列)、第2列的值(PID列,即进程号列)、第3列的值(CPU列)、第4列的值(MEM列,即内存列)
# head -n 10指只输出结果集的前十行数据
root@hgdm:~# ps aux | grep -v '%CPU' | sort -nr -k3 | awk '{ print $1,$2,$3,$4 }' | head -n 10
root 659890 2.3 0.8
mysql 994722 0.5 6.9
helper 1117825 0.4 0.6
helper 1117760 0.4 0.6
helper 1117730 0.4 0.6
helper 1117832 0.3 0.6
helper 1117821 0.3 0.5
helper 1117814 0.3 0.6
helper 1117807 0.3 0.6
helper 1117788 0.3 0.6