AWK - 在system()函数上抑制stdout

时间:2015-04-17 20:56:02

标签: awk

我正在编写一个shell脚本,该脚本将被赋予一个目录,然后输出该目录的ls,其中包含来自附加到每一行的C程序的返回码。只需要为常规文件调用C程序。

我遇到的问题是来自C程序的输出混乱了awk的输出,我无法将stdout重定向到awk内的/ dev / null。我没有输出,我只需要返回代码。速度绝对是一个因素,所以如果你有一个更有效的解决方案,我会很高兴听到它。代码如下:

directory=$1
ls -i --full-time $directory | awk '
{
    rc = 0
    if (substr($2,1,1) == "-") {
        dbType=system("cprogram '$directory'/"$10)
    }
    print $0 " " rc
}
'

1 个答案:

答案 0 :(得分:1)

awk不是shell所以你不能在awk脚本中使用shell变量,而在shell中总是引用你的变量。试试这个:

directory="$1"
ls -i --full-time "$directory" | awk -v dir="$directory" '
{
    rc = 0
    if (substr($2,1,1) == "-") {
        rc = system("cprogram \"" dir "/" $10 "\" >/dev/null")
    }
    print $0, rc
}
'

哦,当然,实际上并没有这样做。请参阅http://mywiki.wooledge.org/ParsingLs

我只花了一分钟思考你的脚本实际在做什么,而不是尝试使用awk作为shell并解析ls的输出,看起来你真正想要的解决方案更像是:

directory="$1"
find "$directory" -type f -maxdepth 1 -print |
while IFS= read -r dirFile
do
    op=$(ls -i --full-time "$dirFile")
    cprogram "$dirFile" >/dev/null
    rc="$?"
    printf "%s %s\n" "$op" "$rc"
done

并且您可以使用-printf的{​​{1}} arg保存一个步骤,以获取您当前使用find的任何信息。