Grepコマンドを使用して文書の内容を区別する

Grepコマンドを使用して文書の内容を区別する

リモートコンピュータを更新するためのスクリプトを作成しており、更新する前にユーザーがコンピュータを使用していることを知りたいです。ユーザーリストがあり、すべてのユーザーのための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 USERgrep -x

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

おすすめ記事