【问题标题】:parallel grep pattern multiple files并行 grep 模式多个文件
【发布时间】:2014-02-25 11:06:37
【问题描述】:

我正在使用此命令成功搜索:从日志目录(压缩文件)中的 txt 文件 ips.txt 中搜索可疑 IP 列表。

root@yop# find /mylogs/ -exec zgrep -i -f ips.txt {} \; > ips.result.txt

我现在想使用 parallel 来加快搜索速度。 我目前无法找到正确的参数。我的意思是使用模式文件(每行一个)并将其导出到结果文件中。

请问有没有相应的大师?

我发现的更接近的命令是这样的: grep-or-anything-else-many-files-with-multiprocessor-power

但无法将其与模式文件列表一起使用并将结果也导出到文件中......

请帮忙,谢谢大家。

【问题讨论】:

  • 根据您拥有的日志文件的数量,您可能只能将您的作业置于后台以并行化它们。此外,如果您正在寻找不需要通配符的 IP 地址,您也可以更快地找到zfgrep。

标签: bash parallel-processing grep gnu-parallel


【解决方案1】:

如果您只想一次运行多个作业,请考虑使用GNU parallel:

parallel zgrep -i -f ips.txt :::: <(find /mylogs -type f) > results.txt

【讨论】:

  • 不建议将 $() 与::: 一起使用。原因是如果 $() 返回包含空格的文件名,那么这些将被 shell 拆分。最好这样做:find /mylogs -type f | parallel zgrep -i -f ips.txt &gt; results.txt 甚至:parallel zgrep -i -f ips.txt :::: &lt;(find . -type f) &gt; results.txt 但如果文件都在同一个目录中,这也可以:parallel zgrep -i -f ips.txt ::: * &gt; results.txt
  • Ole 是正确的。值得一提的是,当指定-0 标志时,GNU 并行支持\0(空)分隔符。所以下面可以用来处理文件名奇怪的文件:find /mylogs -type f -print0 | parallel -0 zgrep -i -f ips.txt &gt; results.txt
  • 我觉得我的论点有点意思......史蒂夫:find /my/logs/ -type f -print0 |并行 -0 zgrep -i -f ips.txt > results.txt /bin/bash: -c: option requires an argument /bin/zgrep: line 161: 1: missing pattern;尝试/bin/zgrep --help' for help /bin/bash: -c: option requires an argument /bin/bash: ips.txt: command not found parallel zgrep -i -f ips.txt :::: &lt;(find /mys/logs -type f) &gt; results.txt /bin/zgrep: line 161: 1: missing pattern; try /bin/zgrep --help' 寻求帮助
  • 我想我的论点有点意思...我需要了解手册:) 史蒂夫:find /my/logs/ -type f -打印0 |并行 -0 zgrep -i -f ips.txt > results.txt /bin/bash: -c: option requires an argument /bin/zgrep: line 161: 1: missing pattern;尝试/bin/zgrep --help' for help /bin/bash: -c: option requires an argument /bin/bash: ips.txt: command not found parallel zgrep -i -f ips.txt :::: &lt;(find /mys/logs -type f) &gt; results.txt /bin/zgrep: line 161: 1: missing pattern; try /bin/zgrep --help' 寻求帮助
  • $ 并行 -V | head -n 1 警告:您正在使用--tollef。如果事情很奇怪,请使用--gnu。我要添加 --gnu 并测试.. 好的,它正在使用: parallel --gnu zgrep -i -f ips.txt :::: results.txt
【解决方案2】:

如何循环文件,然后将每个文件放入后台作业?正如 Mark 评论的那样,如果您有大量日志文件,这可能不适合。还假设您没有在后台运行任何其他东西。

mkdir results

for f in "$(find /mylogs/)"; do 
    (zgrep -i -f ips.txt "$f" >> results/"$f".result &); 
done

wait

cat results/* > ip.results.txt
rm -rf results

您可以使用 head 和/或 tail 限制要搜索的文件数量,例如只搜索前 50 个文件:

for f in "$(find /mylogs/ | head -50)"; do...

接下来的50个:

for f in "$(find /mylogs/ | head -100 | tail -50)"; do...

等等。

【讨论】:

  • 这可能会导致线条相互交叉。
  • 修改为避免写入同一个文件
  • 是的,可以用于后台作业。我也试试那个。我的问题确实更多是关于性能问题(我想),因为目录中有很多文件。我想提高性能速度:) 我将对确保获得时间值的作业进行一些测试并与并行进行比较。无论如何,这是否有平行的等价物?感谢 flx josh 的回答!
  • 无需循环等待,只需执行一次不带参数的等待即可全部等待。
猜你喜欢
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多