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

  • Welke grep? GNU grep? Gebruik je Linux, Solaris, de BSDs?
  • Ik ' m met Linux.

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *