Re: Slightly OT: How to grep for two different things in a file

From: Mehmet Erol Sanliturk <m.e.sanliturk_at_gmail.com>
Date: Thu, 08 Sep 2022 04:56:40 UTC
On Thu, Sep 8, 2022 at 7:45 AM Michael Schuster <michaelsprivate@gmail.com>
wrote:

> On Thu, Sep 8, 2022 at 5:43 AM Carl Johnson <carlj@peak.org> wrote:
> >
> > Aryeh Friedman <aryeh.friedman@gmail.com> writes:
> >
> > > I have 2 patterns I need to find in a given set of files.  A file only
> > > matches if it contains *BOTH* patterns but not in any given
> > > relationship as to where they are in the file.   In the past I have
> > > used piped greps when both patterns are on the same line but in my
> > > current case they are almost certainly not on the same line.
>
> I put together a simple awk-version (on linux, but there shouldn't be
> much difference to BSD) - consider this a start, not a solution:
> --- begin multigrep.awk
> /foo/ {foo_line=NR; if (bar_line > 0) { printf "%d; %d\n", foo_line,
> bar_line; exit } }
> /bar/ {bar_line = NR; if (foo_line > 0) { printf "%d; %d\n", foo_line,
> bar_line; exit } }
> --- end multigrep.awk
>
> HTH
>
> > >
> > > For example my two patterns are "tid" (String variable name) and
> > > "/tmp" [String literal] (i.e. the full string is the concatenation of
> > > the two patterns I would do:
> > >
> > > grep -Ri tid src/java|grep -i /tmp
> > >
> > > But since /tmp is in a symbolic constant defined elsewhere (in a
> > > different Java file) I need to find programmatically either the name
> > > of the constant (has different names in different classes) and then do
> > > the piped grep above with it or I need to look for the two patterns
> > > separately and say a file is only accepted if it has both.
> > >
> > > P.S. The reason for this is I am attempting to audit my code base to
> > > see what classes leave behind orphaned temp files.
> >
> > I use grep -l to just return a list of files that contain one pattern,
> > and then grep -l for the second pattern on that list.  That can be done
> > in one line for your example as follows:
> >
> >   grep -li /tmp `grep -liR tid src/java`
> >
> > I hope that gives you some ideas.
> > --
> > Carl Johnson            carlj@peak.org
> >
>
>
> --
> Michael Schuster
> http://recursiveramblings.wordpress.com/
> recursion, n: see 'recursion'
>
>

During my program development , I am using the technique defined by Carl
Johnson
for more than thirty years .

At the beginning I was using grep but it was not very useful .

I have developed my own search program to make my multiple successive
searches for
AND requiring phrases by generating and then utilizing file lists  .

Michael Schuster's suggestion is also very good  if intermediate file lists
are not required .


With my best wishes .


Mehmet Erol Sanliturk