zgrep 一列并打印匹配的文件名

zgrep 一列并打印匹配的文件名

我正在尝试在 Linux 计算机上的数千个 gzip 压缩文件中匹配特定列的模式,并根据匹配我想打印文件名如何做到这一点。以下选项不适合我,请提出任何建议。谢谢

zgrep 12345 *|  awk -F"^" '{if($8==12345) print}' 
find . -type f |xargs zcat |  awk -F"^" '{if($8==12345) print}' 

答案1

最清晰/最简单的恕我直言是:

while IFS= read -r fname; do
    zcat "$fname" | awk -F'^' -v fname="$fname" '$8==12345{print fname, $0}'
done < <(find . -type f)

但也可以选择从 zgrep 打印文件名并使用 awk 读取它,这可能更有效(但依赖于不包含任何:s 的文件名):

zgrep -H '12345' * |
awk -F'^' '{fname=$0; sub(/:.*/,"",fname); sub(/[^:]+:/,"")} $8==12345{print fname, $0}'

两种解决方案都假设您的文件名中没有换行符,第一个解决方案还假设\t文件名中没有转义序列。

相关内容