作为半个系统管理员,学好linux命令及编好shell程序成为了必须,但是功夫不是一早一夕练成的,只有在 工作中慢慢总结经验。废话少说,写下今天仔细看的,方便以后查用。
正则表达式
要用好shell,必须得精通正则表达式:
* : 匹配前面字符的任意多次,如1133*匹配113、1133、11333、1133312等等
. : 用于匹配任意一个字符,但不能是换行,例如13.就不能匹配13
^ : 匹配行首,但是在中括号[]中,表示取反
$ : 匹配行尾,如^$就匹配空行
[] : 匹配中括号中的某一个字符集,如[xyz]将会匹配x或y或z,[0-9a-zA-Z]匹配一个数字或字母
\ : 转义符号,在“”中其将特殊字符解释为字面含义,但在‘’中失效
"\<the\>" : 转义的尖括号,其表示匹配完整的单词the,而then、other等都不符合
"[0-9]\{5\}": 转义的大括号,其表示精确匹配5个数字
? : 匹配其前面的字符1次或者0次
+ : 匹配前面的字符一次或者多次
() : 括起一组正则表达式,如re(a|e)d匹配read或者reed,管道线“|”表示或者
这只是一份简单的介绍,但是已经涵盖了很多情况了
awk
awk是一门基于域的文本处理语言,其功能非常之强大,我们只在这里萃取一下shell经常运用的部分。我们 结合一个例子来看awk的用法:
CONTAINER ID
5a0cb84b33b7 zhing/ruby:sinatra
95e98d5e9ea6 ubuntu:12.04
5de2bdbd425c zhing/ruby:sinatra
61678af828f0 ruby:latest
ebccb6b30826 zhing/ruby:sinatra
88fa7c02dc86 ruby:latest
43edaa47497e 10.1.1.64:5000/ubuntu:12.04
e62c95f1549c 10.1.1.64:5000/paas:nats
6ac7d8eaa777 zhing/ruby:sinatra
de5793cd6868 ubuntu:12.04
4dbca9313025 zhing/ruby:sinatra
9f3412d14a15 zhing/ruby:sinatra
027fcca3f64f 10.1.1.64:5000/paas:nats
这是通过docker ps -a而得到的一系列容器的ID和镜像,其实后面的字段还有很多,我就选了两个字段。 现在需要提取出容器ID,然后对于容器ID进行排序,可以这样来做:
docker ps -a | awk '{printf "%s\n",$1}' | grep -v CONTAINER | sort
是不是很cool。下面我们来看看sort
sort
网上有一篇很好的博文,讲述了sort如何使用:http://blog.sina.com.cn/s/blog_a56ef5490101dh9i.html , 我们只需要抓住它把一行作为一个元素就好用许多了:
sort -u : 在输出行中去除重复行
-r : sort的默认排序为升序,-r选项改为降序
-o : sort默认将结果输出为标准输出,但是-o可以将输出重定向到文件中
-n : 以数字而非字符来排序
-t -k:如果我们需要将一行分成几个字段,-t可以指定分隔符,-k指定字段的列数
我们经常把sort与awk、grep等一起来使用,给我们写代码往往带来简单高效的便利。
grep
我们日常使用grep应该是最多的了,这个命令相对更简单,是对正则表达式的应用。
grep -i : 在字符串比较时忽略大小写
-n : 显示匹配的行号
-v : 反向检索
-w : 匹配完整单词,与正则表达式中的尖括号效果相同
-x : 匹配完整行
说到grep,我们每次都会想到find和xargs命令,这三个命令配合能产生让人惊奇的效果,如我们要找当前 目录下的任意文件,文件中包含了"zhing"这个完整单词,我们可以这样写:
find . -name "*" | xargs grep -w zhing
熟悉命令只是书写shell的第一步,也是最关键的一步。