Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何执行在匹配模式的每一行上都有多个参数的命令_Linux_Bash_Shell_Awk - Fatal编程技术网

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

Linux 如何执行在匹配模式的每一行上都有多个参数的命令,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我已尝试以下命令: 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循环,该循环读取每一行并在每一行上执行命令 while read line do $(/usr/bin

我已尝试以下命令:

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循环,该循环读取每一行并在每一行上执行命令

while read line
do
    $(/usr/bin/xyz argument1 argument2)
    echo '$line'
done <<<
读取行时
做
$(/usr/bin/xyz argument1 argument2)
回显“$line”

完成你可以这样写

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

仅为了简化代码而不更改逻辑:

while read line; do
    $(/usr/bin/xyz argument1 argument2)
    echo "$line"
done <<< $(/usr/bin/xyz argument1 argument3) | awk '/Off/ {print $1, $3}'
我将引号从单引号(
)更改为双引号(
),因为使用单引号时,它将始终输出
$line
(字面意思),而使用双引号时,它将输出该变量的内容

$(/usr/bin/xyz argument1 argument2)
这将运行
/usr/bin/xyz argument1 argument2
,获取输出,然后对其进行评估。如果您无法正确控制可能运行的内容,这可能会带来安全风险。例如,假设
/usr/bin/xyz
实际上是
echo
。那么我们可以:

$(echo argument1 argument2)
这意味着
while
循环将尝试使用选项
argument2
执行
argument1
。这是您想要的吗


如果您可以提供来自
$(/usr/bin/xyz argument1 argumentnmt2)
$(/usr/bin/xyz argument1 argument3)| grep off | awk'{print$1,$3}'
的一些示例输出,您的
$(..)
construct非常勇敢,但肯定是可能的,但除此之外-你的问题是什么?while循环的输出被管道传输到
grep Off | awk'{print$1,$3}'
。循环的输入是
usr/bin/xyz argument1参数3的输出
$(/usr/bin/xyz argument1 argument2)
$(echo argument1 argument2)
/usr/bin/xyz argument1 argument3 | while read line; do
    /usr/bin/xyz argument1 argument2
    echo "$line"
done | awk '/Off/ {print $1, $3}'
/usr/bin/xyz argument1 argument3 | awk '/Off/ {print $1, $3}' \
    | while read line; do
        /usr/bin/xyz argument1 argument2
        echo "$line"
done