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