Shell

使用heredoc內容的Grep命令

  • April 23, 2016

我正在創建一個腳本來更新遠端電腦,並且我想知道在更新之前是否有任何使用者正在使用該電腦。我有一個使用者列表,我為所有使用者創建了一個heredoc。我試圖使命令看起來像這樣:

ps -ef | grep -f | cat <<- END
   user1
   user2
   user3
END

這是行不通的。我該怎麼做才能使用heredoc根據我的使用者列表過濾ps命令?

簡短的回答:ps -u user1,user2,user3


您的grep命令不完整,因為該-f選項需要一個參數。您的cat命令正在從此處文件接收其輸入,因此即使您修復了該grep命令,其輸出也會被丟棄。

如果你正在尋找一個硬編碼的使用者,你會使用

ps -ef | grep alice

(除了這不是一個好方法,我稍後會解釋)。的輸入grep是 的輸出ps -ef。您可以通過傳遞多個-e選項來傳遞多個搜尋模式:

ps -ef | grep -e alice -e bob

這將列印包含aliceor的行bob。要從文件中獲取輸入列表,您可以使用該-f選項,但這需要一個文件名。

cat <<EOF >users.txt
alice
bob
END
ps -ef | grep -f users.txt

您正在過濾的文本已採用標準輸入,因此您無法將其重複用於搜尋模式。需要多個輸入是一個常見問題,因此一些 shell(ksh、bash、zsh)提供了一個解決方案:程序替換(這是don_crissti評論中建議的):

ps -ef | grep -f <(cat <<END
alice
bob
END
)

如果使用者列表是由複雜的命令生成的,這種方法很有用,但是對於硬編碼的列表,它會變得不必要地複雜:grep -e alice -e bob做同樣的工作。


這種方法的問題在於它匹配行中任意位置的使用者名。該ps命令具有僅列出特定使用者集的程序的選項。就用那個。

ps -u alice,bob

如果您使用的嵌入式系統的版本ps不支持-u,請查看它是否支持-o USER,並使用grep -x以匹配整行。

busybox ps -o user | grep -x -e alice -e bob

引用自:https://unix.stackexchange.com/questions/278402