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

  • Hvilket grep? GNU grep? Er du på Linux, Solaris, BSDerne?
  • I ' m ved hjælp af Linux.

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *