awk - 从标准输入读取程序和输入?

awk - 从标准输入读取程序和输入?

awk是否可以从标准输入读取程序和输入?

我希望能够将文件通过管道传输到以下函数。

process_data () {
  awk -f - <<EOF
{print}
EOF
}

注意:实际的程序更长,它不能作为命令行参数传递,而且我不想使用临时文件。

目前它没有输出任何内容。

$ yes | head | process_data 
$ 

答案1

process_data() {
  awk -f /dev/fd/3 3<< \EOF
  awk code here
EOF
}

请注意,命令行参数可以包含换行符,虽然有长度限制,但通常超过几百千字节。

awk '
  BEGIN {...}
  /.../ ...
  END {...}
'

如果问题与在awk脚本中嵌入单引号字符有关,另一种方法是将代码存储在变量中:

awk_code=$(cat << \EOF
{print "'quoted' " $0}
EOF
)

并做:

process_data() {
  awk "$awk_code"
}

答案2

为什么需要从以下位置获取程序标准输入?您可以使用单引号 ( '),因为 Bash 允许您将内容拆分为多行。

# awk 'BEGIN { sum = 0 }
{ sum += $1 }
END { printf("sum = %d\n", sum) }' << EOF
1
2
3
EOF

相关内容