如何在 .gz 文件列表中查找字符串?

如何在 .gz 文件列表中查找字符串?

我有一个文件夹列表,每个文件夹中有大约 600 个 .gz 文件,系统每 15 分钟自动生成一次。我需要显示 .gz 文件中重复的特定字符串。并找到该字符串所在的.gz文件?

答案1

给定一些顶级目录 ,topdir所有压缩文件都位于该目录下,并假设您正在使用 的 GNU 实现zgrep

zgrep -R -l -F --include='*.gz' -e 'string' topdir

这将在任何压缩文件中搜索string子字符串,并返回所有匹配文件的路径名。gziptopdir

zgrep在没有 GNU 的系统上使用zgrep,您可能无法使用--include.如果您只包含压缩文件,这可能不是问题topdir,但如果您只想搜索带有.gz文件名后缀的文件,您可以这样做

find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +

这将找到名称以.gzunder结尾的所有常规文件topdir,并将zgrep在尽可能大的批次上运行给定的命令。

如果你甚至没有zgrep,你可以这样做

find topdir -type f -name '*.gz' -exec sh -c '
    for pathname do
        if gzip -dc "$pathname" | grep -q -F -e 'string'; then
            printf "%s\n" "$pathname"
        fi
    done' sh {} +

这会提取每个文件并将其传递给普通的grep.如果找到包含给定字符串的行,则打印文件的路径名。

请注意,“内部”shell 脚本是一个循环,可以轻松修改它以处理*.gz单个目录中的所有文件:

for pathname in ./*.gz; do
    if gzip -dc "$pathname" | grep -q -F -e 'string'; then
        printf "%s\n" "$pathname"
    fi
done

如果您想string作为完整单词而不是子字符串进行匹配,请添加-w到上面的调用中grep。如果string您希望将其解释为正则表达式,请删除-F

答案2

如果您正在寻找事先未知的重复字符串,这里有一个脚本,它将在一组文件中查找重复的单词(这里的单词意味着任何周围有空格的东西):

#!/bin/bash

dup_words() {
    zcat $1 | tr ' ' '\n' | sed '/^$/d' | sort | uniq -c | awk '{if ($1 > 1) m=1; } END { exit(!m) } '
}

for i in *.gz
do
    dup_words $i && echo $i
done

它将在每次出现空格时分割行,然后删除空行,查找并计算出现次数,最后检查是否出现超过 1 次。

循环仅输出文件名,您可以&&根据需要调整之后的操作。

答案3

您可以使用此命令来查找该字符串是否出现在某个文件夹下的某些 .gz 文件中:

zgrep the_string  *.gz -l

要对全部位于一个文件夹中的文件夹列表执行此操作:

find . -name "*.gz" | xargs zgrep the_string -l

例如,输出是这样的:

./tmp/2/F.tar.gz
./tmp/2/F1.tar.gz
./tmp/1/F.tar.gz
./tmp/1/F1.tar.gz

现在您将获得包含该字符串的文件列表。

答案4

你可以使用这个命令 -

zgrep "foo" $(find . -name "*.gz")

相关内容