shell scripting: grepping multiple patterns, logically ANDed

Tim Daneliuk tundra at tundraware.com
Wed Jun 27 15:33:46 UTC 2012


On 06/27/2012 10:25 AM, Tim Daneliuk wrote:
> On 06/27/2012 09:25 AM, Aleksandr Miroslav wrote:
>> hello,
>>
>> I'm not sure if this is the right forum for this question, but here
>> goes.
>>
>> I have the following in a shell script:
>>
>>
>>      #!/bin/sh
>>
>>      if [ "$#" -eq "0" ]; then
>>              find /foo
>>      fi
>>      if [ "$#" -eq "1" ]; then
>>              find /foo | grep -i $1
>>      fi
>>      if [ "$#" -eq "2" ]; then
>>              find /foo | grep -i $1 | grep -i $2
>>      fi
>>      if [ "$#" -eq "3" ]; then
>>              find /foo | grep -i $1 | grep -i $2 | grep -i $3
>>      fi
>>
>> Is there an easier/shorter way to do this? If there are 15 arguments
>> supplied on the command line, I don't necessarily want to build 15 if
>> statements.
>>
>> Thanks in advance for your answers.
>
> The following solution relies on the fact that you can include multiple
> patterns for grep to match with the '-e' argument:
>
>
>    #!/bin/sh
>
>    PATTERNS=`echo " $*" | sed s/\ /\ -e\ /g`
>
>    find /foo | grep $PATTERNS
>
> Notice that when constructing the $PATTERNS string out of the command line
> args, you have to quote them with a prepended space character.  That's because
> the subsequent 'sed' substitution needs to find a space *before* each argument
> which it then replaces with "-e ".
>

Whoops, I just realized that I ORed them and you want them ANDed.  Hmmm ... must
go think on that...


More information about the freebsd-questions mailing list