- 论坛徽章:
- 1
|
下边是关于awk源码读取输入的分析:
main函数在进行参数,初始化后,调用do_input()读取输入
Do_input使用while循环,处理“每个输入”
while ((iop = nextfile(FALSE)) != NULL) {}
其中nextfile函数调用iop_open打开文件
Iop_open函数里有么一段:
if (STREQ(name, "-"))
openfd = fileno(stdin);
else if (do_traditional)
goto strictopen;
strictopen:
if (openfd == INVALID_HANDLE)
openfd = open(name, flag, 0666);
即对待-,是去读取输入的
再回头来看看参数解析过程,
在main函数里进行解析输入文件参数: srcfiles_add(CMDLINE, argv[optind]);
实际上是个宏定义:
#define srcfiles_add(stype, val) /
add_src(&srcfiles, &numfiles, &allocfiles, stype, val)
往一个数据结构里去增加一个元素,一个元素代表一个输入文件
并上上述的next_file中去遍历
static long i = 1;//初始i为1
static int files = FALSE;
for (; i < (long) (ARGC_node->lnode->numbr); i++) {…
files = TRUE;}// ..里调用lookup去查找文件,找到时,files会置为true
if (files == FALSE) {
files = TRUE;
/* no args. -- use stdin */
/* FNR is init'ed to 0 */
根据files为false判断无输入文件参数(包括-),即默认读取stdin做为输入
结论:
Awk:读取输入的几种方式
1:没有指定输入文件,即读取标准输入(通常采用管道实现) echo 3 | awk '{print $0}' 输出 3
2:有输入文件,就不读取标准输入(除非指定-) echo 3 | awk '{print $0}' a.txt (或者echo 3 | awk '{print $0}' <a.txt 或者 echo 3 | awk '{print $0}' 0<a.txt)仅输出文件a.txt 内容
3:如果有输入文件,又想读取标准输入,可以用-, echo 3 | awk '{print $0}' - a.txt 输出 3和文件a.txt 内容
|
|