问题..{ 我的用户的主目录位于 /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}