システムにログインしていないユーザー数を確認するコマンドはありますか?
ログインしているユーザー数とログインしていないユーザー数を数えるシェルスクリプトを作成しようとしています。
ベストアンサー1
ユーザーグループのリスト
次のコマンドを使用して、すべてのローカルユーザーのリストを取得できます。
$ getent passwd | awk -F: '{print $1}'
メモ: getent
ローカルユーザーが存在せずsssd
(または同様のサービスを実行してLDAPユーザーを取得し)、権限がファイルに制限されていると仮定して/etc/nsswitch.conf
ローカルユーザーを返します。つまり、NIS や NIS+ などの項目は含まれません。純粋なローカルユーザーの場合awk -F: '{print $1}' /etc/passwd
。
現在ログインしているユーザーのリスト:
$ who
現在ログインしていないユーザーのリスト:
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
<(getent passwd | awk -F: '{print $1}')
最後のエントリは、ログインしたユーザーのリストを取得し、ログインしたユーザーを除くすべてのユーザーのリストを表示するために使用されますgrep -vf
。
カウントを受ける
数を取得するには、wc -l
コマンドの最後に追加します。
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
<(getent passwd | awk -F: '{print $1}') | wc -l
53
ログイン
$ who | awk '{print $1}' | sort -u | wc -l
1
grep フラグ
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines,
any of which is to be matched.
-x, --line-regexp
Select only those matches that exactly match the whole line.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains
zero patterns, and therefore matches nothing.
grepの代わりにJoinを使う
このタイプの問題は自動車の運転室でより多く発生するため、あきらめてgrep
代わりに使用することもできます。これは、一致するものを除いて、2番目のパラメータの一意の項目のみを表示したいという意味を使用する必要があります。join
join
join -v 2
getent ...
-a FILENUM
also print unpairable lines from file FILENUM, where FILENUM is
1 or 2, corresponding to FILE1 or FILE2
-v FILENUM
like -a FILENUM, but suppress joined output lines
$ join -v 2 <(who | awk '{print $1}' | sort -u) \
<(getent passwd | awk -F: '{print $1}' | sort) | wc -l
53
メモ:usingに関する唯一の注意点join
は、両方のリストを並べ替える必要があるため、追加する必要が| sort
あることですgetent ...
。