簡體   English   中英

將命令的輸出與bash中的數組匹配

[英]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.

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