sort 命令可以对文件内容进行多种形式排序。
1. 使用 -n 选项按照数字排序# sort tmp.txt
1
11
3
5
9
# sort -n tmp.txt
1
3
5
9
11
2. 使用 -r 选项按照倒序排序
仍然用第 1 例中的测试文本 tmp.txt:# sort -nr tmp.txt
11
9
5
3
1
3. 使用 -M 选项按月份排序(Jan, Feb, Dec 等)
测试文本:# cat tmp.txt
Jan
Oct
Feb
March
May
Dec 运行输出:# sort -M tmp.txt
Jan
Feb
March
May
Oct
Dec
4. 使用 -C 选项检测该文件是否已经被排序过
下面是一个测试脚本:
[Bash shell] 纯文本查看 复制代码 #!/bin/bash
sort -MC $1
if [ $? -eq 0 ]; then
echo "Files Sorted"
else
echo "Files Unsorted"
fi
该脚本用来检测一个文本中的内容是否已经按照 -M 选项的要求来排序过,运行如下:# cat tmp.txt
Jan
Oct
Feb
March
May
Dec
# cat tmps.txt
Jan
Feb
March
May
Oct
Dec
# ./chksort.sh tmp.txt
Files Unsorted
# ./chksort.sh tmps.txt
Files Sorted
5. 使用 -m 选项合并已经排序过的文件,但不重新再排序
假设两个已经排序过的文件如下:# cat tmps.txt
Jan
Feb
March
May
Oct
Dec
# cat tmpns.txt
1
3
5
7
9 对这两个文件使用 -m 选项将之合并:# sort -m tmpns.txt tmps.txt
1
3
5
7
9
Jan
Feb
March
May
Oct
Dec
6. 使用 -k 选项按照指定 key 进行排序
这里的 key 实际上就是列号。下面是测试文本内容:# cat tmp.txt
windows 3000
macios 5000
ucosii 1000
freebsd 2000
linux 7000 按照第 1 列来排序:# sort -k 1 tmp.txt
freebsd 2000
linux 7000
macios 5000
ucosii 1000
windows 3000 由上可见,第 1 列按照可每行的第 1 个字母的顺序来排列。如果指定 -k 2 那么就是按照第 2 列来排序,第 2 列是数字形式,因此最好加个 -n 选项,不加也可以:# sort -nk 2 tmp.txt
ucosii 1000
freebsd 2000
windows 3000
macios 5000
linux 7000
上面,-k 指定的 key 号默认是文本内容的列号,但有时我们需要在根据一行中的某部分内容进行排序,这时候需要给出一个排序范围依据。如下面的测试文本:# cat tmp.txt
133232welcome
839231hello
1081318groad
8401831net 按照指定范围来排序:# sort -nk 2,3 tmp.txt
1081318groad
133232welcome
839231hello
8401831net
# sort -nk 2,4 tmp.txt
1081318groad
133232welcome
839231hello
8401831net
7. 使用 -u 选项进行唯一性排列(uniq)测试文本内容:# cat temp.txt
hello
anono
groad
hello 使用 -u 选项排序上面的文本:# sort -u temp.txt
anono
groad
hello
8. 使用 -t 选项指定分隔符:[beyes@groad.net ~]$ sort -n -t: -k3 /etc/passwd | less
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
... ... 这里,-t 选项指出了每行的分隔符为一个冒号,且 -k 选项指出了这是分隔后的第 3 个域。 |