对grep和sort命令进行学习,这里主要学习下sort,等学习到正则时再对grep进行补充。
grep命令
命令组包含三个命令:grep,egrep,fgerp
egrep是gerp搜索的指定模式等同grep -E 使用扩展字符串进行搜索。fgerp等同grep -F 快速搜索命令,只检索固定字符串。
sort命令
sort命令对文本文件进行排序,今天对这个命令进行探究。
默认情况下,排序关键字的顺序有系统使用的字符集(ASCII码)决定。
1.sort [选项] 文件列表
sort默认是按照ASCII码从小到大排序
例如:
//使用cat查看文件内容
[bestcoder@localhost test]$ cat f1
bbbbbb
aaaaaa
ccccbb
ccccaa
[bestcoder@localhost test]$ sort f1
aaaaaa
bbbbbb
ccccaa
ccccbb
[bestcoder@localhost test]$ cat f5
aaaaaaa
AAAAAAA
BBBBBBB
[bestcoder@localhost test]$ sort f5
aaaaaaa
AAAAAAA
BBBBBBB
这里我们发现一个奇怪的问题,在ASCII中,A为065而a为097,这样的排序顺序明显是不符合的,我们如何更改呢?
解决方案: 设置语言环境变量 LC_ALL=C
具体措施:
查看语言环境变量的本地配置,
$locale
......
LC_ALL=zh_CN.GB18030
$ sort f5 //查看当前排序情况
然后:
$ export LC_ALL=C
$ sort f5 //查看更改后的排序情况
结果为:
[bestcoder@localhost test]$ sort f5
AAAAAAA
BBBBBBB
aaaaaaa
解释:locale 命令是将有关当前语言环境或全部公共语言环境的信息写到标准输出上。
注意:当设置语言环境变量的时候,一些值包含着其它语言环境变量的值。例如,如果LC_ALL 语言环境变量设置为 En_US 语言环境,那么所有的语言环境变
量都被设置为 En_US语言环境。另外,隐式值封装在双引号中(")。显式设置的值并不封装在双引号中(")。请参阅 AIX 5L Version 5.2National Language
Support Guide and Reference 中的《理解语言环境变量》 获取更多的信息。
为了确定当前的字符映射,请输入:
locale charmap
如果LC_ALL 语言环境变量设置为 C 语言环境,locale 命令会生成以下的输出:
[bestcoder@localhost test]$ locale charmap
ANSI_X3.4-1968
2.常用选项:
-m 对已排序的文件进行合并,但并不排序。
[bestcoder@localhost test]$ cat f2
aaaabb
dddddd
bbbbbb
[bestcoder@localhost test]$ cat f1
bbbbbb
aaaaaa
ccccbb
ccccaa
[bestcoder@localhost test]$ sort -m f1 f2
aaaabb
bbbbbb
aaaaaa
ccccbb
ccccaa
dddddd
bbbbbb
-c 检查给定的文件是否已经排序,若未,则显示出错信息,不排序。
[bestcoder@localhost test]$ sort -c f1
sort:f1:2:无序: aaaaaa
-u 对排序后的重复行只输出第一行,与-c一起用时严格按照顺序检查。
[bestcoder@localhost test]$ cat f3
bbbbbb
cccccc
aaaaab
abbbbb
bbbbbb
[bestcoder@localhost test]$ sort -u f3
aaaaab
abbbbb
bbbbbb
cccccc
-o 将排序输出到该文件名指定的文件FILE中。若文件不存在,则创建一个新文件。
[bestcoder@localhost test]$ cat f3
bbbbbb
cccccc
aaaaab
abbbbb
bbbbbb
[bestcoder@localhost test]$ sort -u -of8 f3
//将f3去重排序后得到的结果指定到f8文件(若f8不存在,则自动创建)
[bestcoder@localhost test]$ cat f8
aaaaab
abbbbb
bbbbbb
cccccc
-f 忽略字母大小写
[bestcoder@localhost test]$ cat f5
aaaaaaa
AAAAAAA
BBBBBBB
[bestcoder@localhost test]$ sort -f f5
AAAAAAA
aaaaaaa
BBBBBBB
-r 按逆序排列
[bestcoder@localhost test]$ sort f5
AAAAAAA
BBBBBBB
aaaaaaa
[bestcoder@localhost test]$ sort -r f5
aaaaaaa
BBBBBBB
AAAAAAA
-n 以数值进行排序,假想我们排2和10时,当以ASCII码排序时(默认从小到大)为 10 2,但以数值排序为 2 10,故我们对数值排序时要使用-n
-t 指定字符作为字段间的分隔符,一般与-k一起使用达到排序效果
-k n1[,n2] 指定从文本行第n1字段开始至第n2字段(不包括n2字段)中间的内容作为排序关键字。如果没有n2,则文本行第n1字段开始至末尾。
n1和n2可以是小数形式,x.y,x表示第x字段,y表示第x字段的第y个字符。
//假如我们将日期按照月份进行升序排列,如何操作呢?
[bestcoder@localhost test]$ cat f5
2015-12-3
2013-2-2
2020-4-02
1022-8-5
[bestcoder@localhost test]$ sort -n -k 2 -t - f5 //-n 数值 -k 2 第二个字段作为排序关键字 -t - 以-为排序分隔符
2013-2-2
2020-4-02
1022-8-5
2015-12-3
可以看出月份按升序排列2、4、8、12
-h 比较关键字时忽略前导的空白符(空格或者制表符)
[bestcoder@localhost test]$ sort f2
BAA
AAAA
aaaa
[bestcoder@localhost test]$ sort -b f2
AAAA
BAA
aaaa