Jag måste grep några filer för att se vilka som innehåller ett visst ord:
grep -l word *
Därefter måste jag grep listan över filer för att se vilka som innehåller ett annat ord. Det enkla sättet skulle förmodligen vara att skriva ett manus men jag vet inte riktigt hur man ska arbeta det.
Kommentarer
Svar
Förutsatt att inget av filnamnen innehåller tomt utrymme, enstaka citat, dubbelt citat eller bakåtstreck (eller börja med – med GNU grep
) kan du göra:
grep -l word * | xargs grep word2
Xargs kör den andra grep över varje fil från den första grep.
Med GNU grep
/ xargs
eller kompatibel, du kan göra det mer tillförlitligt med:
grep -lZ word ./* | xargs -r0 grep word2
Med -Z
blir grep
skriv ut filnamnen NUL-avgränsad så att den kan användas med xargs -0
. Alternativet -r
till xargs
undviker att den andra grep
körs om den första grep
inte hittar något.
Svar
grep -l word1 $(grep -l word2 *)
eller kanske för ett av de två orden på samma rad:
grep -w "word1\|word2" *
se här
Svar
Om du behöver hitta filer som innehåller ett ord och sedan filtrera bort de filer som innehåller ett annat ord, kan du använda en sådan kommandosekvens:
grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2
-
grep word *
– visar alla filer som innehåller ”word”, filnamnet kommer först i listan. -
awk -F ":" "{print $1}"
– skriver bara ut filnamnet på dina resultat -
uniq
– ser till att du inte skriver ut filnamnet mer än en gång. -
xargs grep word2
– söker igen i listan över filer du har fått.
Kommentarer
- @don_crissti Men att kombinera delar
grep -l word1 * | xargs -d'\n' grep -l word2
fungerar för allt utom nylinje, vilket är konstigt nog, nästan ingen använder det.
grep
? GNUgrep
? Är du på Linux, Solaris, BSD: erna?