Home > other >  Using regex in grep filename
Using regex in grep filename

Time:01-13

I want to search a certain string in a number of archival log folders which reflect different servers. I use 2 different commands as of now

-bash-4.1$ zcat /mnt/bkp/logs/cmmt-54-22[8-9]/my_app.2021-12-28-* | grep 'abc'

and

-bash-4.1$ zcat /mnt/bkp/logs/cmmt-54-23[0-3]/my_app.2021-12-28-* | grep 'abc'

I basically want to search on server folders cmmt-54-228, cmmt-54-229 .... cmmt-54-233.

I tried combining the two commands into one but it doesn't seem to be working some mistake in using regex from my side

-bash-4.1$ zcat /mnt/bkp/logs/cmmt-54-22[8-9]|3[0-3]/my_app.2021-12-28-* | grep 'abc'

Please help.

CodePudding user response:

Regex is not glob. See man 7 glob vs man 7 regex.

grep with with regex. grep filters lines that match some regular expresion.

Shell expands words that you write. Shell replaces what you write that contains "filename expansion triggers" * ? [ and replaces that word with a list of words of matching filenames.

You can use extended pattern matching (see man bash), which sounds like the most natural here:

shopt -s extglob
echo /mnt/bkp/logs/cmmt-54-2@(2[8-9]|3[0-3])/my_app.2021-12-28-*

In interactive shell I would just write it twice:

zcat /mnt/bkp/logs/cmmt-54-22[8-9]/my_app.2021-12-28-* /mnt/bkp/logs/cmmt-54-23[0-3]/my_app.2021-12-28-*

Or with brace expansion (see man bash):

zcat /mnt/bkp/logs/cmmt-54-2{2[8-9],3[0-3]}/my_app.2021-12-28-*

Braces expansion first replaces the word by two words, then filename expansion replaces them for actual filenames.

You can also find files with a -regex. For that, see man find. (Or output a list of filenames and pipe it to grep and then use xargs or similar to pass it to a command)

  •  Tags:  
  • Related