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

  • Vilken grep? GNU grep? Är du på Linux, Solaris, BSD: erna?
  • I ' m med Linux.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *