history | sed “s#^\s\+[0-9]\+\s\+##g” | grep -oP “(?<=^|\|)\w+”|sort |uniq -c| sort -k1,1nr -k2
用于统计最近使用的linux命令。从rex大神的blog上学来的。以前学过一部分基本的正则,但是看这行还是比较费解。根据rex兄指点,搞了半天文档,基本明白相关正则表达式的用法了。感慨一下,正则表达式真是个牛X的东东,威力无穷啊!谢谢rex兄!
history
目的:从 history 命令中得到最近使用过的linux命令。
sed “s#^\s\+[0-9]\+\s\+##g”
目的:删除每行的行号。
解析:#号为分割符,可以自定义为’/',’:'等;’^\s+’表示一行开始的一个或多个空白符;’[0-9]\+’表示一个或多个数字;接下来’\s\+’与前面的一致,表示多个空白符;##为分割符号;g为结尾修饰符,在替换区之外作限制修饰作用,这里表示全局含义,与此类似的还有【i,m,g,,,】,via。
grep -oP “(?<=^|\|)\w+”
目的:记录每一行中的命令。行首的第一个英文单词,以及管道后面的第一个英文单词,视为命令名称。
解析:零宽断言(?<=exp)表示匹配exp后面的位置,为分组语法。-o表示输出匹配行的非空匹配部分。’^|\|’表示行开始或(‘|’)管道标识符开始的。’\w+’表示一个或多个字符,这里位一个英文单词。
sort
目的:将得到的命令列表排序。
uniq -c|sort -k1,1nr -k2
目的:统计每个命令的出现次数,先以次数降序排列,再以命令名称升序排列。
解析:’k1,1nr’表示按照第一行降序排列。’-k2′默认表示按照第二行升序列,也可写为’-k2,2n’。
参考文档:
统计最近用过的linux命令
Sed – An Introduction and Tutorial
Regular Expressions
正则表达式30分钟入门教程
用sort对ip地址排序