如何将管道从查找到解压缩到grep

时间:2018-07-21 06:14:07

标签: bash grep find pipe unzip

find . -name "*.ooutline" -print0 | xargs -0 -n1 unzip -c | grep  -m 10 -Eo ".{0,20}$1.{0,20}" 

“。ooutline'文件是OmniOutliner文件的压缩文件。我想找到它们,包括在子目录中递归地查找这些文件;通过管道将其解压缩;将每个.ooutline文件解压缩到内存中;然后将已解压缩文件的内容grep到内存中

尝试用find进行操作没有太多运气。我确实有一个有效的bash shell脚本,如下所示:

#!/bin/bash

for file in *.ooutline; do
    if ( unzip -c "$file" |   grep --label="$file" -H  -m 10 -Eo ".{0,20}$1.{0,20}"  )  ; then
        printf "\n\n"
    fi
done

我希望能够通过find在一行上执行此操作。我对此表示感谢。谢谢。

第二天

进步!这有效,但仅适用于列表中的文件之一。这意味着这个想法是正确的,但我有些细节是错误的。注意:我从堆栈上的另一篇文章中得到了find-exec-unzip的主意:我确实有带空格的文件名。

find . -name '*.zip' -exec sh -c 'unzip -c -d "`dirname \"{}\"`" "{}"' ';' | grep  -m 10 -Eo ".{0,20}Peter.{0,20}"

我尝试过

find . -name '*.zip' -exec sh -c 'unzip -c  "{}"' ';' | grep  -m 10 -Eo ".{0,20}Peter.{0,20}"

它返回了这些结果

  

版本Peter睡眠与饮水   他们把彼得带到这里来的原因   阿德金斯博士发现彼得屈膝   在ICU外面祈祷。彼得确信“五我还没有去那里”。   彼得给他演讲

...因此,它肯定是从一个文件返回的东西(对科幻小说的分析)。

4 个答案:

答案 0 :(得分:1)

使用zipgrep,您可以这样做:

find . -name '*.ooutline' -print0 | xargs -0 zipgrep -Ho '.{0,20}$1.{0,20}'

答案 1 :(得分:0)

尝试使用 GNU Parallel ,并并行使用所有可爱的Intel CPU内核:

find . -name \*.ooutline -print0 | parallel -0 --tag 'unzip -c {} | grep -Eo ".{0,20}"'

--tag用文件名标记输出行。 {}代表输入文件名。

答案 2 :(得分:0)

我相信您原来的find命令可以正常工作,但是您忘了将其放在脚本文件中,说script.sh,然后将字符串作为命令行参数传递了吗?这是我采取的步骤,请让我知道在哪里做出错误的假设:

已执行的命令:

echo Alice Bob Peter >'Alice Bob Peter.txt'
echo Alice Alice Alice >'Alice Alice Alice.txt'
echo Alice Peter Bob >'Alice Peter Bob.txt'
for f in 'Alice Bob Peter.txt' 'Alice Alice Alice.txt' 'Alice Peter Bob.txt';do zip "${f%txt}ooutline" "$f";done
echo 'find . -name "*.ooutline" -print0 | xargs -0 -n1 unzip -c | grep  -m 10 -Eo ".{0,20}$1.{0,20}"' >script.sh
bash script.sh Peter

输出:

Archive:  ./Alice Peter Bob.ooutline
 extracting: Alice Peter Bob.txt     
Alice Peter Bob
chive:  ./Alice Bob Peter.ooutline
tracting: Alice Bob Peter.txt     
Alice Bob Peter

答案 3 :(得分:0)

这听起来像是您只是问如何在unzip找到的每个文件上调用find,并将其输出通过管道传输到grep。将unzip替换为cat进行演示:

$ cat file
Wee, sleekit,
cowrin', tim'rous beastie,
Oh whit a panic's
in thy breastie

$ find . -maxdepth 1 -name file -exec sh -c 'cat "{}" | grep "whit"' \;
Oh whit a panic's

$ find . -maxdepth 1 -name file -exec cat "{}" \; | grep "whit"
Oh whit a panic's

$ find . -maxdepth 1 -name file -print0 | xargs -0 -I {} sh -c 'cat {} | grep "whit"'
Oh whit a panic's

$ find . -maxdepth 1 -name file -print0 | xargs -0 cat | grep "whit"
Oh whit a panic's

这两个怎么了?我可以看到您尝试了类似的方法,并且您似乎在说它们有问题,但是您没有提供示例输入或预期输出,因此我们无法确定问题出在哪里。尝试使用带有cat的纯文本文件,而不是要求带解压缩的zip文件,这样您就可以在问题中显示[mcve]。