Jeg må grep noen filer for å se hvilke som inneholder et bestemt ord:

grep -l word * 

Neste må jeg ta tak i den listen over filer for å se hvilke som inneholder et annet ord. Den enkle måten ville sannsynligvis være å skrive et manus, men jeg vet ikke helt hvordan jeg skal jobbe det.

Kommentarer

  • Hvilken grep? GNU grep? Er du på Linux, Solaris, BSD-ene?
  • I ' m ved bruk av Linux.

Svar

Forutsatt at ingen av filnavnene inneholder mellomrom, enkelt sitat, dobbelt anførselstegn eller tilbakeslagstegn (eller start med – med GNU grep), kan du gjøre:

grep -l word * | xargs grep word2 

Xargs kjører den andre grep over hver fil fra den første grep.

Med GNU grep / xargs eller kompatibel, du kan gjøre det mer pålitelig med:

grep -lZ word ./* | xargs -r0 grep word2 

Ved å bruke -Z blir grep skriv ut filnavnene NUL-avgrenset slik at den kan brukes med xargs -0. -r alternativet til xargs unngår at den andre grep kjøres hvis den første grep ikke finner noe.

Svar

grep -l word1 $(grep -l word2 *) 

eller kanskje for et av de to ordene på samme linje:

grep -w "word1\|word2" * 

se her

Svar

Hvis du trenger å finne filer som inneholder et ord og deretter filtrere ut de filene som inneholder et annet ord, kan du bruke en sekvens med kommandoer som denne:

grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2 
  • grep word * – viser alle filene som inneholder «word», filnavnet vil være først i listen.
  • awk -F ":" "{print $1}" – vil bare skrive ut filnavnet på resultatene dine
  • uniq – vil sørge for at du ikke skriver ut filnavnet mer enn en gang.
  • xargs grep word2 – vil igjen søke i listen over filer du har fått.

Kommentarer

  • @don_crissti Men å kombinere brikker grep -l word1 * | xargs -d'\n' grep -l word2 fungerer for noe annet enn ny linje, noe som er rart nok nesten ingen bruker det.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *