grep
ユーザーリスト(コマンドラインで提供)とユーザーがログイン/操作中またはログインしていない場合は、その出力をどのように取得できますか?
答え1
perl -le 'print while $_=getpwent' | sort
ユーザー名のリストが提供されます。
ps -eo user= | sort -u
そのuidが1つ以上の実行中のプロセスの有効なユーザーIDであるユーザー名のリストが提供されます。
who | awk '{print $1}' | sort -u
現在のユーザーが一覧表示されます。ログイン
printf '%s\n' "$@" | sort -u
スクリプトに引数として渡されたユーザーが一覧表示されます。
この4つのリストがあるので、このcomm
コマンドを使用して、それらのリストのどちらが特定の2つのリストに共通であるか、1つのリストに表示され、他のリストには表示されないかを選択できます。
プロセスの置き換えをサポートするシェルを使用すると、一時ファイルの生成を回避できます。
たとえば、
#! /bin/bash -
comm -12 <(printf '%s\n' "$@" | sort -u) \
<(ps -eo user= | sort -u)
と呼ばれる:
./my-script root mythul stephane
3人のユーザーのうち誰がプロセスを実行しているかを報告します(システムのユーザー名とuidの間に1対1の関係があるとします)。