Shell
使用heredoc內容的Grep命令
我正在創建一個腳本來更新遠端電腦,並且我想知道在更新之前是否有任何使用者正在使用該電腦。我有一個使用者列表,我為所有使用者創建了一個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
這將列印包含
alice
or的行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