2つのファイルから一致しないアイテムをインポートする[閉じる]

2つのファイルから一致しないアイテムをインポートする[閉じる]

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}

関連情報