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
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.
grep
? GNUgrep
? Er du på Linux, Solaris, BSD-ene?