Als ik find gebruik, hoe kan ik dan de bestandsnaam en het regelnummer retourneren als ik naar een string zoek? Het lukt me om de bestandsnaam in het ene commando terug te geven en de regelnummers met een ander, maar ik kan ze “niet combineren.

Bestandsnamen: find . -type f -exec grep -l "string to search" {} \;

Regelnummers: find . -type f -exec grep -n "string to search" {} \;

Antwoord

De opdrachtregelschakelaar -H dwingt grep om de bestandsnaam af te drukken, zelfs met slechts één bestand.

% grep -n 7 test.in 7:7 % grep -Hn 7 test.in test.in:7:7 

 -H, --with-filename Print the filename for each match. 

Merk op dat zoals Kojiro zegt in een opmerking , dit maakt geen deel uit van de POSIX-standaard; het is zowel in GNU als in BSD grep, maar het is mogelijk dat sommige systemen dit niet hebben (bijv. Solaris).

Reacties

  • Dit antwoord kan worden verbeterd door erop te wijzen dat de -H vlag naar grep is een niet-standaard GNU-extensie en biedt een alternatieve benadering voor niet-GNU-systemen.

Antwoord

find . -type f -exec grep -n "string to search" /dev/null {} + 

(of met GNU grep, zie de -H option)

Reacties

  • zowel + als -H werken prima, bedankt!
  • En gerelateerd aan dit antwoord: unix.stackexchange.com/questions/3682/…
  • +1 Juist, want als grep meerdere bestandsnaam-args zou hebben, zou het gedwongen worden om de overeenkomende bestandsnamen uit te voeren. Slim!

Antwoord

Als je grep het recursieve -r vlag, dit lost uw verzoek op:

grep -rn "String to search " * 

Reacties

  • Dat ' is waar, maar ik ' zie niet wat dit toevoegt aan de bestaande antwoorden.
  • En als er maar één is (geen punt ) bestand in de huidige directory, dit toont niet de bestandsnaam.

Geef een reactie

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