Q.. {私のユーザーのホームディレクトリは/ homeにあるので、次のコマンドを使用して自分の基準に一致するユーザーのリストを取得できます。
ステップ1:ユーザーリストをインポートする
du -h --max-depth=1 /home 2>/dev/null | egrep -v '(!G|.cp)' | awk -F"/" '{print $NF}'
注:ホームディレクトリには逆方向grepを必要とする追加のファイルが含まれているため、拡張grepモードが必要です。 Gは、データが1G未満のユーザーの部分的なリストが必要であることを意味します。
ステップ2:フリーズしたユーザーのリストを取得する
ls -al /somedir/ | grep -v 'lock'
ステップ3:ファイル1の2つのリストを比較し、ファイル2に存在しない行を取得する必要があります。
それでこの時点で止まってしまいました。 uniq&diffコマンドを試しましたが、私の条件に一致するユーザーのリストを取得できませんでした。
PS:2つのファイルを比較するコマンドは、このファイルを1行ずつ比較してはならず、全体的に比較する必要があります。したがって、ファイル1のすべての行とファイル2の欠落行を出力する必要があります。
答え1
まあ、少し調べてみましたが、私が探している解決策はこれです
comm -23 <(sort File1) <(sort File2)
答え2
2 つのコマンドを 1 つに結合するには、かっこを使用します。
( du -h --max-depth=1 /home 2>/dev/null | egrep -v '(!G|.cp)' | awk -F"/" '{print $NF}' ; ls -al /somedir/ | grep -v 'lock' ; ) | sort | uniq
括弧で囲まれた2つのコマンドの出力は連結され、1つのプロセス(サブシェル)の出力として表示されます。
PS:最初のコマンドは/home
ディレクトリに出力されます...
答え3
生成された2つのファイルを繰り返すのではなく、より長いユーザー名のリストを繰り返し、他のディレクトリに対してテストします。
for userpath in /home/*/; do
user=$( basename "$userpath" )
if [ ! -e "/somedir/$user" ]; then
printf 'User %s is not suspended\n' "$user"
fi
done
これは、すべてのサブディレクトリを繰り返し、その名前と/home
比較して各ディレクトリのデフォルト名(ユーザー名)をテストします/somedir
。他のディレクトリにその名前がない場合、ユーザーは一時停止しません。
答え4
他のファイルにない限り、ファイル内のすべての行/単語をリストするには、次のようにします。
grep -v -f {smallfile} {bigfile}