巧用shell减少重复性劳动

工作一年多了,常常感觉自己很忙碌,却有很多时候又觉得自己其实没做多少事情,只是重复日复一日的工作。作为程序员,工作的本质便是用计算机来替代人类完成一些工作。又或者说,但凡是能提炼成某种模式的重复性工作,就可以使用计算机自动化完成。然而回到我们自己的工作中来,又有多少人仔仔细细地反思自己工作中的每一个动作,将其中重复的动作自动化呢?

“人的时间比机器宝贵”,不记得这是哪家公司的格言了。窃以为想在工作中越来越高效,善于利用机器的时间来替换人的时间至关重要。比如今天下午在公司里清理环境上的冗余资源:数千个ipset一一删除。倘若是手动来做,估计干到晚上都干不完。但若稍微停下来想一想,便会发现这个事情其实就是一条命令的事情。

for setname in $(ipset list -n); do ipset delete $setname; done 

想到了这条命令,一个回车下去,一天的事情就做完了。回家吃饭去也。

当然,计算机的强大远不止如此,特别是linux shell,真正是个令人叹为观止的强大兵器。在此做一个小小的梳理,希望自己可以在将来的工作中少一些机械的重复,多一些巧劲!

1,awk

awk是一个非常常用的文本分析工具,它将文件逐行读入,以空格为默认空格符将每行切片,再将切片后的数据做进一步的处理。最基本的命令格式如下:

awk '{pattern + action}' {filenames}

其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。举几个简单的例子:

history | awk '{print $2}'   # 列出之前输入过的命令,去掉前面的编号  
cat /etc/passwd |awk  -F ':'  '{print $1}'  # 指定分隔符为:
cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'  # 打印两部分内容,以tab分隔  
awk -F: '/root/{print $7}' /etc/passwd  # 匹配有root的行

2,sed

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。
1)常用选项:
-n∶使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的资料一般都会被列出到萤幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将sed的动作写在一个档案内,-f filename则可以执行filename内的sed动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。

2)常用命令:
a ∶新增,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c ∶取代,c的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

3,xargs

之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令。xargs可以读入stdin的资料,并且以空白字元或断行字元作为分辨,将stdin的资料分隔成为arguments。因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候,xargs可能就会误判了。

最常见的xargs用法有两类,一种是上一个命令返回的多行结果需要作为下一个命令的多个参数一次性传入,例如:

ls -l | awk '{print $9}' | grep test.* | xargs rm  # 批量删除目录下test前缀的文件

另一种情况便是要将上一个命令返回的多行结果依次作为下一个命令的参数执行。此时可以指定每次注入的参数数量,例如:

ls -l | awk '{print $9}' | grep test.* | xargs -n 1 echo
4,grep

grep就不多说了,很常用的正则表达式搜索工具。值得一提的是grep命令可以同时对多个文件做搜索,同时还可以用zgrep对压缩文件进行搜索。此外,grep -v可以排除满足条件的一些内容。

#####参考资料:
1,xargs用法详解
2,awk命令详解
3,sed命令常见用法

Written on October 24, 2015