awk读取标准输入的讨论&awk源码读取输入部分分析
来源:互联网 发布:人机界面触摸屏软件 编辑:程序博客网 时间:2024/05/14 21:54
今天群里有人问了个问题:
grep ...|awk ... filename
这种情况下awk先将管道|的数据处理完后,再开始处理文件filename么?
答案很多人都知道是否定的,
一般的格式是:grep ...filename|awk ...
不过问题目的人是想实现这样的功能:
grep ... file1 | awk ... file2
将grep后的结果送给awk先存下来,再处理file2
大致的需求是明白了
问题大于awk在有文件参数的情况下是忽视标准输入的(见下边的源码分析)
所以解决的方法有下边几个
1:awk ... <(grep ... file1) file2
2:grep ... file1 | awk ... - file2
下边是关于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:没有指定输入文件,即读取标准输入(通常采用管道实现)
2:有输入文件,就不读取标准输入(除非指定-)
3:如果有输入文件,又想读取标准输入,可以用-,即为开头的例子
- awk读取标准输入的讨论&awk源码读取输入部分分析
- awk读取标准输入的讨论&awk源码读取输入部分分析
- 如何使awk读取标准输入
- awk读取输入数字时对进制的判断问题
- 从标准输入读取
- shell_read读取标准输入
- java 读取标准输入
- php读取标准输入的方式
- 【Perl读书笔记】读取标准输入
- awk 输入文件
- awk输入单引号
- awk读输入(getline)
- AWK读取文件
- awk啊随机读取
- awk 如何读取命令行上的参数
- awk读取文件里面的某个字段
- MapReduce源码分析之MapReduce如何读取、解析输入文件
- C++ 从标准输入设备读取字符的函数
- DataTable 动态添加 删除行
- Bloom Filter 原理与应用
- UML类图关系大全
- 根据电脑屏幕分辨率调整控件至最大化
- vtk图形模型九类对象
- awk读取标准输入的讨论&awk源码读取输入部分分析
- 测试株连分析如何配置
- 关于Isolated Storage的存取路径
- 开启和使用H2控制台
- 属性表单和向导的创建
- 数组集合之TList
- VirtualBox 安装 redhat 9.0 时硬盘不可用的问题
- 奇闻一则,工资万元的连锁店店员!!
- 线程安全