簡體   English   中英

如何執行在匹配模式的每一行上具有多個參數的命令

[英]How to execute a command which has multiple arguments on every line of a matching pattern

我已經嘗試了以下命令:

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

解釋(我的假設):

下面的命令將被執行並將結果傳遞給grep命令以過濾文本'Off'的匹配行,然后打印第1列和第3列。

$(/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 <<<

你可以這樣寫

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

請注意,沒有行,因為有兩個參數傳遞給while塊。

另外,由於您已經有了awk ,因此不需要grep

只是為了簡化代碼而不更改邏輯:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM