开发者

grep a pattern in list of zip files recursively

开发者 https://www.devze.com 2023-03-02 02:52 出处:网络
I am using the following command on command line for getting the pattern matched lines. find . -name \"*.gz\"|xargs gzcat|grep -e \"pattern1\" -e \"pattern2\"

I am using the following command on command line for getting the pattern matched lines.

find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"

i need now to find only the file names where the pattern is present. how can i do it on command line?

开发者_Go百科

grel -l has no use since i am using xargs gzcat before grep


Check if you have zgrep available. And then, if yes:

find . -name '*.gz' -exec zgrep -l -e ".." -e ".." {} +

If you don't have it - well, just copy it from some machine that has it (all linuxes I use have it by default) - it's a simple bash script.


ripgrep

Use ripgrep, for example, it's very efficient, especially for large files:

rg -z -e "pattern1" -e "pattern2" *.gz

or:

rg -z "pattern1|pattern2" .

or:

rg -zf pattern.file .

Where pattern.file is a file containing all your patterns separated by a new line character.

-z/--search-zip Search in compressed files (such as gz, bz2, xz, and lzma).


for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" && echo $i; done


Untested; does everything inside find so if you have loads of gz files you wont have performance problems as runs each gzcat/grep as soon as it finds files nothing is piped out:

find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;


In bash, I'd do something like this (untested):

find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done


grep/zgrep/zegrep

Use zgrep or zegrep to look for pattern in compressed files using their uncompressed contents (both GNU/Linux and BSD/Unix).

On Unix, you can also use grep (which is BSD version) with -Z, including -z on macOS.

Few examples:

zgrep -E -r "pattern1|pattern2|pattern3" .
zegrep "pattern1|pattern2|pattern3" **/*.gz
grep -z -e "pattern1" -e "pattern2" *.gz # BSD/Unix only.

Note: When you've globbing option enabled, ** checks the files recursively, otherwise use -r.

-R/-r/--recursive Recursively search subdirectories listed.

-E/--extended-regexp Interpret pattern as an extended regular expression (like egrep).

-Z (BSD), -z/--decompress (BSD/macOS) Force grep to behave as zgrep.

0

精彩评论

暂无评论...
验证码 换一张
取 消