命令行管道编程¶
在Shell命令中“grep, sed, awk, cat, cut, uniq, sort, ...”等都可以使用管道,即,直接使用上一个命令的输出作为当前命令的输入,而不使用中间文件。如:
# 使用一长串命令,可以直接得到当前哪个IP访问最多
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort | head -10
那么如何写这样一个可以使用管道功能的程序呢?简单看一下head等的源码就可以得到结果。
C中的实现¶
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
char buf[10];
fread(buf, sizeof(buf), 1, stdin);
fprintf(stdout, "%s\n", buf);
return 0;
}
Shell中的实现¶
#!/bin/bash
#tr '[:lower:]' '[:upper:]' < /dev/stdin
input=`cat < /dev/stdin`
echo $input | awk '{print $1}'
Python中的实现¶
#!/bin/env python
import sys
f = open("/tmp/access_log", "r")
f.write(sys.stdin.read())
f.close()