比如,我们有个需求:linux命令ls
,对ls的输出做进一步的处理,再显示处理之后的结果。
本质上,管道|
的输出,对于下一级来说就是stdin。我们用sys.stdin
来读取。假设这个处理脚本名为test.py
,代码如下:
#!/usr/bin/env python3
import sys
in_log = sys.stdin.readlines()
print(in_log)
用chmod +x test.py
设置为可执行后,我们来测试一下:ls | ./test.py
,效果如下,得到一个python列表,里面存放着文件名和文件夹名:
['file_a.txt\n', 'file_b.txt\n', 'dir_a\n', 'dir_b\n']
这一部分不是这篇文章的重点。比如,我们来过滤一下,只显示文件夹:
import os
for line in in_log:
line = line.strip()
if os.path.isdir(line):
print(line)
多个管道级联时,上一级的输出作为下一级的输入。这里的输出就是指输出到屏幕,对应到python就是简单的print
。所以上面的代码已经支持多个管道级联。
经过测试,ls | ./test.py | ./test2.py
是没有问题的,可以进行多次处理和筛选。