LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 242|回复: 0

精通awk系列(27):awk预定义函数(2):IO类预定义函数

[复制链接]
发表于 2023-12-26 15:37:46 | 显示全部楼层 |阅读模式

awk IO类内置函数

close(filename [, how]):关闭文件或命令,参考close
system(command):执行Shell命令,参考system
fflush([filename]):gawk会按块缓冲模式来缓冲输出结果,使用fflush()会将缓冲数据刷出
从gawk 4.0.2之后的版本(不包括4.0.2),无参数fflush()将刷出所有缓冲数据。

此外,终端设备是行缓冲模式,此时不需要fflush,而重定向到文件、到管道都是块缓冲模式,此时可能需要fflush()。

此外,system()在运行时也会flush gawk的缓冲。特别的,如果system的参数为空字符串system(""),则它不会去启动一个shell子进程而是仅仅执行flush操作。

没有flush时:

# 在终端输入,将不会显示,直到按下Ctrl + D
awk '{print "first";print "second"}' | cat
使用fflush():

# 在终端输入
awk '{print "first";fflush();print "second"}' | cat
使用system()来flush:

awk '{print "first";system("echo system");print "second"}' | cat
awk '{print "first";system("");print "second"}' | cat
也可以使用stdbuf -oL命令来强制gawk按行缓冲而非默认的按块缓冲。

stdbuf -oL awk '{print "first";print "second"}' | cat
fflush()也可以指定文件名或命令,表示只刷出到该文件或该命令的缓冲数据。

# 刷出所有流向到标准输出的缓冲数据
awk '{print "first";fflush("/dev/stdout");print "second"}' | cat
最后注意,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进程的内部信息,但跳过数组

awk '
  BEGIN{
    for(idx in PROCINFO){
      if(typeof(PROCINFO[idx]) == "array"){
        continue
      }
      print idx " -> "PROCINFO[idx]
    }
  }'


文章链接: https://www.junmajinlong.com/shell/awk/awk_builtin_io_function/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表