Search code examples
bashglob

Using regex in grep filename


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.


Solution

  • 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)