![](/img/trans.png)
[英]How can I `find` files matching pattern within a directory matching another pattern from the command line?
[英]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.