リモートコンピュータを更新するためのスクリプトを作成しており、更新する前にユーザーがコンピュータを使用していることを知りたいです。ユーザーリストがあり、すべてのユーザーのためのheredocを作成しました。私が作成したいコマンドは次のとおりです。
ps -ef | grep -f | cat <<- END
user1
user2
user3
END
これはうまくいきません。 Heredocを使用してユーザーリストに基づいてpsコマンドをフィルタリングするにはどうすればよいですか?
答え1
短い答え:ps -u user1,user2,user3
オプションに引数が必要なため、コマンドgrep
は不完全です-f
。あなたのcat
コマンドはhereドキュメントから入力を受け取るので、コマンドを変更してもgrep
その出力は削除されます。
ハードコードされたユーザーを探している場合は、次のものを使用できます。
ps -ef | grep alice
(これは良いアプローチではないことを除いて後で説明します。)入力grep
は出力ですps -ef
。-e
複数のオプションを渡すことで、複数の検索パターンを渡すことができます。
ps -ef | grep -e alice -e bob
これにより、alice
またはを含む行が印刷されますbob
。ファイルから入力リストを取得するにはこの-f
オプションを使用できますが、この場合はファイル名が必要です。
cat <<EOF >users.txt
alice
bob
END
ps -ef | grep -f users.txt
フィルタリング中のテキストは標準入力を使用するため、検索モードでは再利用できません。複数の入力が必要なのは一般的な問題であるため、一部のシェル(ksh、bash、zsh)はソリューションを提供します。プロセスの交換(これは何ですか?ドンクリスティ以下をお勧めします。コメント):
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
答え2
おおむねお勧めしますザイルズの答え。
POSIX仕様に準拠したスクリプトが必要ですが、スクリプトがps
それをサポートしていない場合は、-u
次の方法を使用できます。
ps -ef | grep -e \
"^smtpd
^dbus
^ntp"
ps -ef
つまり、パイプを介して出力されますgrep -e pattern_list
。 Pattern_listは、各パターンで始まり、^
行の先頭に固定される複数行の文字列として提供されます。