Jeg er nødt til at grep nogle filer for at se hvilke der indeholder et bestemt ord:
grep -l word *
Derefter skal jeg gribe listen over filer for at se, hvilke der indeholder et andet ord. Den nemme måde ville sandsynligvis være at skrive et script, men jeg ved ikke helt, hvordan man arbejder det.
Kommentarer
Svar
Forudsat at ingen af filnavnene indeholder mellemrum, enkelt citat, dobbelt citat eller tilbageslagstegn (eller start med – med GNU grep
) kan du gøre:
grep -l word * | xargs grep word2
Xargs kører den anden grep over hver fil fra den første grep.
Med GNU grep
/ xargs
eller kompatibel, du kan gøre det mere pålideligt med:
grep -lZ word ./* | xargs -r0 grep word2
Brug af -Z
gør grep
udskriv filnavnene NUL-afgrænset, så det kan bruges med xargs -0
. -r
mulighed for at xargs
undgår, at den anden grep
køres, hvis den første grep
ikke finder noget.
Svar
grep -l word1 $(grep -l word2 *)
eller måske for et af de to ord på samme linje:
grep -w "word1\|word2" *
se her
Svar
Hvis du har brug for at finde filer, der indeholder et ord og derefter filtrere de filer, der indeholder et andet ord, ud, kan du bruge en række af kommandoer som denne:
grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2
-
grep word *
– viser alle filer, der indeholder “word”, filnavnet er først på listen. -
awk -F ":" "{print $1}"
– udskriver kun filnavnet på dine resultater -
uniq
– sørger for at du ikke udskriver filnavnet mere end en gang. -
xargs grep word2
– søger igen på listen over filer, du har fået.
Kommentarer
- @don_crissti Men at kombinere stykker
grep -l word1 * | xargs -d'\n' grep -l word2
fungerer for alt undtagen newline, hvilket er underligt nok, næsten ingen bruger det.
grep
? GNUgrep
? Er du på Linux, Solaris, BSDerne?