[英]Matching output of a command to an array in bash
我已經搜索了一段時間,但找不到此問題的答案。 我想將特定命令的輸出與腳本中的數組匹配。 我是一個perl編碼器,但是我必須使用的系統類型受到限制,我不能使用perl,並且必須對腳本使用bash。 僅供參考的Debian 5.0.6。
因此,每當我的sudo命令在特定IP上運行時,它都會給出數組中的某些單詞。 我需要將數組中的那些單詞與輸出中給出的任何單詞進行匹配。
此外,該數組還需要查找228種不同的東西。
我的電子郵件變量是在找到一個並且可以正常工作時發送。
array=("City1" "City2" "City 3")
sudo -u user /usr/local/bin/someprogram.pl x.x.x.x;
MATCH1=`grep "$array"`
if [ "{$MATCH1}" != ""]
then
do $email
else done
fi
我對此表示感謝。 對於bash腳本的無知我深表歉意。
如果我正確理解了您的問題:您可以遍歷返回的每一行,並遍歷每種模式,如果有匹配項,則發送電子郵件。
sudo -u user /usr/local/bin/someprogram.pl x.x.x.x | while read line; do
for pattern in "${array[@]}"; do
if [[ $line =~ $pattern ]]; then
$email
break # exit after the first match, or comment out if you want to keep going
fi
done
done
更新
如果您有很多模式和很多行,那么腳本可能會很慢。 也許您可以每行打印一個點作為“進度指示器”,例如:
sudo -u user /usr/local/bin/someprogram.pl x.x.x.x | while read line; do
printf . # prints a dot without linebreak
for pattern in "${array[@]}"; do
if [[ $line =~ $pattern ]]; then
echo # just to clear the line after the printf statements
$email
break # exit after the first match, or comment out if you want to keep going
fi
done
done
echo # clear the line after the printf statements
我認為Janos的解決方案更好,因為它更具可讀性和可維護性,但是以下解決方案更像您提供的代碼模板:
#!/bin/bash
printWords() {
echo City 1 City x
echo City 2
echo City y
echo City 3
}
CMD_OUTPUT=$(printWords)
array=("City 1" "City 3")
MATCH=$(echo $CMD_OUTPUT | grep -E "${array[0]}${array[*]/#/|}")
if [ -n "$MATCH" ] ; then
echo email
fi
${array[0]}${array[*]/#/$(echo \\|)}
在這種情況下將得出City 1|City 1 |City 3
。 第二個替換${array[*]/#/|}
與每個數組元素的(空)開頭匹配,並將其替換為管道符號|
構造一個OR正則表達式。 然而,正則表達式將從管道符號開始,因此也匹配任何空字符串,這就是為什么我將數組的第一個元素放在前面。 還請注意[@]
與[*]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.