![2つのファイルから一致しないアイテムをインポートする[閉じる]](https://linux33.com/image/136191/2%E3%81%A4%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA%E3%81%84%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
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}