在 2 个文件中获取不匹配的条目

在 2 个文件中获取不匹配的条目

问题..{ 我的用户的主目录位于 /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:应该比较两个文件的命令不应该将这些文件逐行比较,而是整体比较,因此文件 1 中的任何行和文件 2 中缺少的行都应该是我的输出。

答案1

好吧,我研究了一下,我正在寻找的解决方案是这样的

comm -23 <(sort File1) <(sort File2)

答案2

使用括号将两个命令组合为一个:

( 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

括号中的两个命令的输出被连接起来并显示为一个进程(子 shell)的输出。

PS:您的第一个命令/home在目录中输出...

答案3

不要遍历两个生成的文件,而是迭代较长的用户名列表并针对其他目录测试它们:

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}

相关内容