喜欢linux的人,一定喜欢shell,一定了解grep ,awk, sed .......
linux的魅力在于所有人能够将各种各样简单的东西通过shell这种胶水任意的揉在一起。来实现强大的功能。最典型的就是编辑利器,vim。
组合的方式有很多,但是最让人爱不释手的就是管道。
前几天突发奇想, 随手写过很多python小工具。如果能够把管道的能力也引进过来,那岂不是妙哉?
在linux中,文件处理是我们基本上天天要干的事情(所有东西都是文件)。
相信这样的语句:
cat /tmp/data.txt | grep sshd > temp.txt
让人再熟悉不过了。
那么我们可不以这样:
cat /tmp/data.txt | python filterLine.py -l 3 | grep "hello"
这样就能无缝的用linux的思想,把我们的python脚本通过管道聚合起来。
好吧。整理下需求:
- 脚本过滤出行号%N == 0 的行。作为结果返回
- N需要作为脚本参数传入
- 脚本接收标准输入
- 脚本将结果通过标准输出打印
废话不多说,我们一步一步来:
1. 核心功能,过滤行,并将结果输出:
def lineFilter(baseNum, lCount, line):
if baseNum % lCount == 0:
print line
2. 脚本可以接收参数:
python2.7引入了一个很实用的模块:argparse。他可以完美的配置你的参数列表,并生成很专业的help信息。
import argparse
parser = argparse.ArgumentParser(description='filter line.')
parser.add_argument('-l', dest='lineNum', type=int,
help='an integer for the line num')
args = parser.parse_args()
3. 脚本接收标准输入:
其实实现起来很简单,只需要读取 sys.stdin 就好。
import sys
for l in sys.stdin:
dosomething ......
好了,所有需求都实现了。我们把它整合在一起:
import sys
import argparse
parser = argparse.ArgumentParser(description='filter line.')
parser.add_argument('-l', dest='lineNum', type=int,
help='an integer for the line num')
args = parser.parse_args()
def lineFilter(baseNum, lCount, line):
if baseNum % lCount == 0:
print line
if __name__ == "__main__":
lCount = 0
for line in sys.stdin:
lCount += 1
lineFilter(args.lineNum, lCount, line)
sys.exit(0)
记得在程序退出的时候加上sys.exit(0)。
这是一个好习惯。因为我们经常需要在一个命令执行完成之后,将命令执行的结果状态返回,以供接下来的流程判断,比如:
ls /tmp/sdfsdfsdfffsd
#其实没有这个文件夹
if [ $? -ne 0 ]
then
echo "error"
fi
*声明,欢迎转载,但请注明出处,亲。