grep来自多个文件的多个字符串,并在找到第一个匹配项时停止处理其他文件

时间:2019-05-29 08:28:15

标签: bash grep

我有大约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中搜索。希望有道理。

3 个答案:

答案 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