如何在匹配模式的每一行上执行具有多个参数的命令

时间:2016-03-10 05:28:50

标签: linux bash shell awk

我尝试过以下命令:

| John Doe | 123 Cherry Lane | 555-555-5555 | Product 3 |

解释(我的假设):

将执行以下命令,并将结果传递给grep命令以过滤匹配的行,文本为“Off”,然后打印第1列和第3列。

while read line;
do
    $(/usr/bin/xyz argument1 argument2)
    echo '$line'
done <<< $(/usr/bin/xyz argument1 argument3) | grep Off | awk '{print $1,$3}'

第1列和第3列的所有信息都应传递给while循环,该循环读取每一行并在每一行上执行命令。

$(/usr/bin/xyz argument1 argument3) | grep Off | awk '{print $1,$3}' 

2 个答案:

答案 0 :(得分:0)

你可以像这样写

while read arg1 arg2;
do
    /usr/bin/xyz arg1 arg2;
done < <(/usr/bin/xyz otherargument1 otherargument3 | awk '/Off/{print $1,$3}')

请注意,没有行,因为两个参数都传入while块。

此外,您无需grep,因为您已经拥有awk

答案 1 :(得分:0)

只是为了简化代码而不改变逻辑:

while read line; do
    $(/usr/bin/xyz argument1 argument2)
    echo "$line"
done <<< $(/usr/bin/xyz argument1 argument3) | awk '/Off/ {print $1, $3}'

关于此代码中有些奇怪的一些注意事项:

    echo "$line"

我将引号从单引号(')更改为双引号("),因为使用单引号时,它将始终输出$line(字面意思),而使用双引号时,它将输出该变量的内容。

$(/usr/bin/xyz argument1 argument2)

这将运行/usr/bin/xyz argument1 argument2,获取输出,然后对其进行评估。如果您无法正确控制可能运行的内容,则可能存在安全风险。例如,让我们说/usr/bin/xyz有效echo。然后我们可以:

$(echo argument1 argument2)

这意味着while循环将尝试使用选项argument1 执行 argument2。这是你想要的吗?

您打算herestring<<<)做什么?我猜你不想要任何$(…)包装,你也不想要这个,但是考虑到神秘的xyz程序,你很难猜到。

这是做什么的:

/usr/bin/xyz argument1 argument3 | while read line; do
    /usr/bin/xyz argument1 argument2
    echo "$line"
done | awk '/Off/ {print $1, $3}'

或许awk应该修改输入?在这种情况下,请尝试:

/usr/bin/xyz argument1 argument3 | awk '/Off/ {print $1, $3}' \
    | while read line; do
        /usr/bin/xyz argument1 argument2
        echo "$line"
done