Thursday 3 October 2019

command line - How to Combine find and grep for a complex search? ( GNU/linux, find, grep )


I'm trying to do a text search in some files that share a similar directory structure, but are not in the same directory tree, in GNU/Linux.


I have a web server with many sites that share the same tree structure (Code Igniter MVC PHP framework), so I want to search in a specific directory down the tree for each site, example:


/srv/www/*/htdocs/system/application/


Where * is the site name. And from those application directories, I want to search all the tree down to its leaves, for an *.php file that has some text pattern inside, let's say "debug(", no regular expression needed.


I know how to use find and grep but I'm not good at combining them.


How would I do this?
Thanks in advance!



Answer



Try


find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

This should recursively search the folders under application for files with .php extension and pass them to grep.


An optimization on this would be to execute:


find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

This uses xargs to pass all the .php files output by find as arguments to a single grep command; e.g., grep "debug (" file1 file2 file3. The -print0 option of find and -0 option of xargs ensure the spaces in file and directory names are correctly handled. The -H option passed to grep ensures that the filename is printed in all situations. (By default, grep prints the filename only when multiple arguments are passed in.)


From man xargs:



-0



      Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally).  Disables the end of file string, which is treated like any other argument.  Useful when input items might contain white space, quote marks, or backslashes.  The GNU find -print0option produces input suitable for this mode.



No comments:

Post a Comment

How can I VLOOKUP in multiple Excel documents?

I am trying to VLOOKUP reference data with around 400 seperate Excel files. Is it possible to do this in a quick way rather than doing it m...