【发布时间】:2015-04-10 05:32:44
【问题描述】:
通常 gawk 脚本会处理其标准输入的每一行。是否可以在脚本中指定一个系统命令,使用脚本其余部分中命令输出的每一行的过程?
例如考虑以下简单的交互:
$ { echo "abc"; echo "def"; } | gawk '{print NR ":" $0; }'
1:abc
2:def
我想在不使用管道的情况下获得相同的输出,而是将 echo 命令指定为系统命令。
我当然可以使用管道,但这会迫使我要么使用两个不同的脚本,要么在 bash 脚本中指定 gawk 脚本,我正试图避免这种情况。
更新
前面的例子不太能代表我的用例,这个比较接近:
$ { echo "abc"; echo "def"; } | gawk '/d/ {print NR ":" $0; }'
2:def
更新 2
一个并行的shell脚本如下。如果没有exec 行,脚本将从stdin 读取;使用 exec 它将使用该行作为输入的命令:
/tmp> cat t.sh
#!/bin/bash
exec 0< <(echo abc; echo def)
while read l; do
echo "line:" $l
done
/tmp> ./t.sh
line: abc
line: def
【问题讨论】:
-
你可以说
gawk '{print NR ":" $0; }' < <(echo "abc"; echo "def"),例如。 -
@fedorqui 这几乎与管道使用相同。我希望将命令放入 awk 脚本中。
-
@fedorqui 我无法将其与我的用例联系起来。请参阅我更新的示例。
-
@MiserableVariable 我为您的第二个示例调整了答案。
标签: awk