精通awk系列(27):awk预定义函数(2):IO类预定义函数
回到:
awk IO类内置函数
close(filename [, how])
:关闭文件或命令,参考closesystem(command)
:执行Shell命令,参考systemfflush([filename])
:gawk会按块缓冲模式来缓冲输出结果,使用fflush()会将缓冲数据刷出
从gawk 4.0.2之后的版本(不包括4.0.2),无参数fflush()将刷出所有缓冲数据。
此外,终端设备是行缓冲模式,此时不需要fflush,而重定向到文件、到管道都是块缓冲模式,此时可能需要fflush()。
此外,system()在运行时也会flush gawk的缓冲。特别的,如果system的参数为空字符串system("")
,则它不会去启动一个shell子进程而是仅仅执行flush操作。
没有flush时:
1 | # 在终端输入,将不会显示,直到按下Ctrl + D |
使用fflush():
1 | # 在终端输入 |
使用system()来flush:
1 | awk '{print "first";system("echo system");print "second"}' | cat |
也可以使用stdbuf -oL
命令来强制gawk按行缓冲而非默认的按块缓冲。
1 | stdbuf -oL awk '{print "first";print "second"}' | cat |
fflush()也可以指定文件名或命令,表示只刷出到该文件或该命令的缓冲数据。
1 | # 刷出所有流向到标准输出的缓冲数据 |
最后注意,fflush()刷出缓冲数据不代表发送EOF标记。
awk数据类型内置函数
isarray(var)
:测试var是否是数组,返回1(是数组)或0(不是数组)typeof(var)
:返回var的数据类型,有以下可能的值:- “array”:是一个数组
- “regexp”:是一个真正表达式类型,强正则字面量才算是正则类型,如
@/a.*ef/
- “number”:是一个number
- “string”:是一个string
- “strnum”:是一个strnum,参考strnum类型
- “unassigned”:曾引用过,但未赋值,例如”print f;print typeof(f)”
- “untyped”:从未引用过,也从未赋值过
例如,输出awk进程的内部信息,但跳过数组
1 | awk ' |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙!
评论