`
chinamming
  • 浏览: 141612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

awk读取标准输入的讨论&awk源码读取输入部分分析

 
阅读更多

今天群里有人问了个问题:

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:如果有输入文件,又想读取标准输入,可以用-,即为开头的例子

分享到:
评论

相关推荐

    最好的状态机源代码

    找了很长时间,在codeproject上是5星评价,也是本人看过后觉得非常有参考意义的状态机框架,尤其对游戏开发,完全可以用上

    安卓java读取网页源码-it-ebooks-archive:it-ebooks-archive

    安卓java读取网页源码计算机开放电子书汇总 100个gcc小技巧 100个gdb小技巧 关于浏览器和网络的20 项须知 2015互联网企业校招笔试题 3周3页面 简明Python 教程 A Guide to HTML5 and CSS3 ANSI Common Lisp 中文翻译...

    Linux_unix_shell第一部分编程(共两部分)

    5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准...

    Shell脚本专家指南

    第27章 读取管道输入 第28章 使用cat的自由格式输出 第29章 自动交互处理 第3部分 有用的脚本实例 第30章 使用procmail自动处理邮件 30.1.procmailrc文件 30.2 使用示例 30.3 代码 第31章 进程管理监视器 第32章 ...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    Linux高级bash编程

    使用getopts命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source自身的脚本 11-22. exec的效果 11-23. 一个exec自身的脚本 11-24. 在继续处理之前,等待一个进程的结束 ...

    Advanced Bash-Scripting Guide <>

    for 循环重定向 loop (将标准输入和标准输出都重定向了) 16-10. 重定向if/then 测试结构 16-11. 用于上面例子的"names.data"数据文件 16-12. 记录日志事件 17-1. 广播: 发送消息给每个登录上的用户 17-2. 仿造文件:...

    redhat linux教材20课程学习文档

    5.4.4 读取输入 5.4.5 使用“-”文件 5.4.6 使用设备文件 5.4.7 使用exec 5.4.8 使用eval 5.4.9 使用后台进程 5.5 Shell 程序调试 5.6 Shell 脚本的举例 第六章 高级脚本编程 6.1 awk 的介绍 6.1.1 什么是awk? ...

    毕业设计论文范文源码-InterviewFAQ-Linux:总结操作系统及Linux的面试常见问题

    毕业设计论文范文源码 InterviewFAQ-Linux Linux 常用命令 编辑相关 awk NF:字段总数 NR:第几行数据 FS:分隔字符 sed -n -i 直接修改 4a:在第四行后添加 4i:在第四行前插入 1,5c sting:用sting替换1到5行的...

    你必须知道的495个C语言问题

    1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必需包含static存储类型吗? 1.11 extern在函数声明中是什么意思? ...

    linux.chm文档

    hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/...

Global site tag (gtag.js) - Google Analytics