我有大约270个.bz2日志文件(25天日志)和一个带有大约1500个用户名的文本文件。我需要做的是查找过去25天中谁登录的theese用户。因此,我需要从文件列表中提取用户名,并在第一个文件中找到用户名时停止grepping(找到第一个匹配项时)。
我的代码有效,但是如果在第一个文件中找到匹配项,我不需要处理其他文件,则中断并搜索另一个用户名,如果在第三个文件中找到了它,则中断并搜索另一个用户名:
for i in $(cat /tmp/usernames.txt); do for j in $(ls *.bz2); do
bzgrep -o -m1 $i $j; done; done
在这里,如果在第一个文件中找到匹配项,它将中断(-m1标志)并开始在第二个文件中搜索相同的用户名,但是我不再需要它了。
问题:我需要检查最近25天未登录的用户。所以我可以减少他们在应用程序中的权限。如果用户在过去25天内至少登录了一次,则我不会减少其权限。
问题是:我需要找到我的日志文件中存在谁theese用户名。如果在其中一个文件中找到用户名,则至少要停止一次搜索该用户,然后再搜索另一个用户。
示例:如果在file1中找到了user1,则将其打印并停止在此文件或其他文件中搜索该用户。如果在file8中找到了user2,则将其打印一次,然后停止在file9,file10,file11 ... file250中搜索。希望有道理。
答案 0 :(得分:0)
您可以使用条件:
self.stats = self.base.stats.copy()
此结构意味着仅当$ var不为空时,条件才为True。当条件变为True时,循环将停止。 祝你好运!
答案 1 :(得分:0)
如果不关心磁盘空间,我会要求bzip2将所有存档解压缩为单个文件,然后为每个用户名在该文件上调用grep -m1
>>
bzcat *.bz2 > merged
while IFS='' read -r username; do
grep -om1 "$username" merged
done < /tmp/usernames.txt
rm merged
答案 2 :(得分:0)
您是否只能这样做以获取出现在任何压缩文件中的用户名列表:
bzgrep -o -w -F -f /tmp/usernames.txt *.bz2 | sort -u
,然后将该输出与usernames.txt进行比较,以查看谁登录/未登录?如果事实证明一次检查一个.bz2文件更有效,则将其循环包装:
for file in *.bz2; do
bzgrep -o -w -F -f /tmp/usernames.txt "$file"
done | sort -u
,并且如果这样做也可以提高性能,则可以从每次迭代中删除找到的用户名:
sort -u /tmp/usernames.txt > /tmp/names.txt
for file in *.bz2; do
bzgrep -o -w -F -f /tmp/names.txt "$file" | sort -u > /tmp/found.txt &&
comm -23 /tmp/names.txt /tmp/found.txt > /tmp/left.txt &&
mv /tmp/left.txt /tmp/names.txt &&
cat /tmp/found.txt
[[ -s /tmp/names.txt ]] || break
done