Ik moet een aantal bestanden grepen om te zien welke een bepaald woord bevatten:
grep -l word *
Vervolgens moet ik die lijst met bestanden grepen om te zien welke een ander woord bevatten. De gemakkelijke manier zou waarschijnlijk zijn om een script te schrijven, maar ik weet niet helemaal hoe ik het moet gebruiken.
Reacties
Answer
Ervan uitgaande dat geen van de bestandsnamen spaties, enkele aanhalingstekens, dubbele aanhalingstekens of backslash-tekens (of begin met – met GNU grep
), u kunt het volgende doen:
grep -l word * | xargs grep word2
Xargs zal de tweede grep over elk bestand van de eerste grep uitvoeren.
Met GNU grep
/ xargs
of compatibel, je kunt het betrouwbaarder maken met:
grep -lZ word ./* | xargs -r0 grep word2
Door -Z
te gebruiken, wordt grep
print de bestandsnamen NUL-gescheiden zodat het gebruikt kan worden met xargs -0
. De -r
optie naar xargs
vermijdt dat de tweede grep
wordt uitgevoerd als de eerste grep
niets vindt.
Antwoord
grep -l word1 $(grep -l word2 *)
of misschien voor een van de twee woorden op dezelfde regel:
grep -w "word1\|word2" *
zie hier
Antwoord
Als u bestanden met een woord moet vinden en vervolgens die bestanden met een ander woord wilt filteren, kunt u een reeks opdrachten als volgt gebruiken:
grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2
-
grep word *
– toont alle bestanden die “word” bevatten, de bestandsnaam komt als eerste in de lijst. -
awk -F ":" "{print $1}"
– zal alleen de bestandsnaam van uw resultaten afdrukken -
uniq
– zal ervoor zorgen dat u de bestandsnaam niet meer afdrukt dan een keer. -
xargs grep word2
– zal opnieuw zoeken in de lijst met bestanden die je hebt.
Opmerkingen
- @don_crissti Maar het combineren van stukjes
grep -l word1 * | xargs -d'\n' grep -l word2
werkt voor alles behalve newline, wat raar genoeg is dat bijna niemand het gebruikt.
grep
? GNUgrep
? Gebruik je Linux, Solaris, de BSDs?