1.sort
1.概览
sort按照指定的参数进行排序,支持按照数字排序和字典顺序排序。
排序的选项如下:
其中选项“-n”是使用数字进行排序(默认是按照文字字典顺序排序的)。还有更多额外选项可供选择:
2.特性与实例
1.指定排序字段
对于具有类似表格形式的文件来说,可以给定字段分隔符后,对指定字段进行排序,这是非常有效的功能。其中“-k”指定进行排序的字段,“-t”指定排序字段的分隔符(默认为tab键)。
user@ubuntu:~$ cat /etc/passwd | sort -t ":" -k 3
root:x:0:0:root:/root:/bin/bash
user:x:10:12:.....
....
2.排序顺序指定
sort支持多种排序顺序,-d指定字典顺序,-f忽略大小写,-i忽略不可打印字符,-h依据人类可读数值排序(3K、1G等),-n指定数值排序,-r指定逆序,-R使用随机排序,-M指定按月份排序。
user@ubuntu:~$ sort -nr file.txt
user@ubuntu:~$ sort -M file.txt
user@ubuntu:~$ sort -R file.txt
3.合并和检测
对于一个是否排序过的文件,可以使用-C选项进行检测,另外,对于多个已经排过序的文件,可以使用-m选项进行合并。
user@ubuntu:~$ sort -m sorted1 sorted2
sort -C file;
if [ $? -eq 0 ]; then
echo sorted!;
else
echo unsorted!;
fi
2.uniq
在使用sort排序完成之后,对于完全相同的行会连续排列在一起,为了去除这些重复的行,uniq工具就是专为此准备的:将连续的重复行删除只显示一行。
1.概览
uniq只能使用排序过的数据输入,因此uniq要么使用管道,要么使用排序过的文件,以这种方式与sort命令结合起来使用。
2.特性实例
除了基本的从排过序的文件中去除重复行的功能外,还提供了其他选项增强了这个命令的功能。-u选项只输出唯一的行,-d选项只输出重复的行,-c选项可以为每一行加上出现的次数的前缀。
user@ubuntu:~$ echo -e "bash\ntest\ntest\nroot" | uniq -u
bash
root
user@ubuntu:~$ echo -e "bash\ntest\ntest\nroot" | uniq -d
test
user@ubuntu:~$ echo -e "bash\ntest\ntest\nroot" | uniq -c
1 bash
2 test
1 root
使用上述的-c选项就可以有多重活用,最常用的就是统计文件词频信息,基本步骤就是将文件所有连续空格压缩为一个,然后将所有空格替换为换行符使得每一个单词变为单独一行。最后使用sort进行排序使得相同单词连续排布以及uniq -c进行统计。
user@ubuntu:~$ echo -e "bash\ntest a bash\ntest\nroot" | tr -s ' ' '\n' | sort | uniq -c
1 a
2 bash
1 root
2 test
另外可以使用-s和-w来指定键:-s跳过前N个字符,-w指定用于比较的最大字符数。这样就可以对某个字段进行排序了。最后一个实例,可以使用uniq得出字符串样式。任何一个字符串,只要一个字符重复出现就在前面加上它出现过的次数。
user@ubuntu:~$ echo abcbhdccd | sed 's/[^\n]/&\n/g' | sed '/^$/d' | sort | uniq -c | tr -d ' \n'
1a2b3c2d1h
3.wc
wc命令就是word count的简称,顾名思义就是对文件进行基本的单词统计。
1.概览
wc的默认是按照行数、单词、字符、字节、最长的行的长度这个顺序打印出文件的统计信息。从上述选项中可以看出,我们可以指定不所需要的信息输出。
2.实例
不管是指定一个还是多个需要输出的选项,各自的输出相对顺序是不变的。
<pre class="prettyprint ruby" http:="" www.ahlinux.com="" start="" cmd="" 9040.html"="" target="_blank" style="margin-top: 0px; margin-bottom: 0px; padding: 0.3em;">nlo, Consolas, 'Courier New', monospace; color: rgb(51, 51, 51); border-radius: 4px; margin-top: 0px; margin-bottom: 1.5em; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); overflow-y: auto; background-color: rgb(246, 246, 246);">user@ubuntu:~$echo -e "this is a new line \nsecond line" | wc -l2user@ubuntu:~$echo -e "this is a new line \nsecond line" | wc -w7user@ubuntu:~$echo -e "this is a new line \nsecond line" | wc -c32user@ubuntu:~$echo -e "this is a new line \nsecond line" | wc -L19