Holen Sie sich die Zeilennummer, während Sie grep verwenden

360

Ich verwende grep rekursiv, um Dateien nach einer Zeichenfolge zu durchsuchen, und alle übereinstimmenden Dateien und die Zeilen, die diese Zeichenfolge enthalten, werden auf dem Terminal gedruckt. Aber ist es auch möglich, die Zeilennummern dieser Zeilen zu erhalten?

Beispiel: Derzeit bekomme ich Folgendes /var/www/file.php: $options = "this.target", aber ich versuche zu ermitteln /var/www/file.php: 1142 $options = "this.target";, wo 1142sich die Zeilennummer befindet, die diese Zeichenfolge enthält.

Die Syntax, mit der ich rekursiv grepe, ist sudo grep -r 'pattern' '/var/www/file.php'

Eine weitere Frage ist, wie wir Ergebnisse erhalten, die nicht einem Muster entsprechen. Wie alle Dateien, aber nicht die mit einer bestimmten Zeichenfolge?

sai
quelle
Das Flag -v zeigt Zeilen an, die nicht übereinstimmen (grep -v myText MyFile.txt)
bcarroll

Antworten:

546
grep -n SEARCHTERM file1 file2 ...
Miro A.
quelle
Ich hatte noch eine kurze Frage: Wie erhalten wir Ergebnisse, die nicht einem Muster entsprechen? Wie alle Dateien, aber nicht die mit einer bestimmten Zeichenfolge?
Sai
5
das wäre Kommandozeilenschalter -v. Wenn Sie 'grep --help' ausführen, werden alle Optionen angezeigt
Miro A.
56
Sie brauchen nicht, -rwenn Sie mehrere Dateien angeben. Sie benötigen nur, -rwenn Sie Verzeichnisse angeben.
Sparhawk
@ JeanPaul - Ich sehe das gleiche Ergebnis für -nr und -n -r. Welche Version von grep verwenden Sie? $ grep -n -r name * | wc -l 1984 $ grep -nr name * | wc -l 1984 $ grep -V grep (BSD grep) 2.5.1-FreeBSD
Miro A.
Nur Code-Antwort, keine Erklärung. : S
Florian Castelain
148

Zeilennummern werden gedruckt mit grep -n:

grep -n pattern file.txt

Um nur die Zeilennummer (ohne die passende Zeile) zu erhalten, kann man verwenden cut:

grep -n pattern file.txt | cut -d : -f 1

Linien , die kein Muster enthalten, werden gedruckt mit grep -v:

grep -v pattern file.txt
Carlito
quelle
3
Und letzte übereinstimmende Zeilennummer: grep -n pattern file.txt | cut -d : -f 1 | tail -1(Sie können diese in einer Variablen speichern und damit zB eine Datei daraus erstellen)
Nux
Und um die Zahl / den Doppelpunkt am Anfang jeder Zeichenfolge zu entfernen, können Sie grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
Folgendes
24

Wenn Sie nur die Zeilennummer möchten, gehen Sie wie folgt vor:

grep -nr Pattern file.ext | gawk '{print $1}' FS=":"

Beispiel:

$ grep -nr 9780545460262 EXT20130410.txt | gawk '{print $1}' FS=":" 
48793
52285
54023
Wolke fällt
quelle
1
awk -F: '{print $1}'auch funktioniert und Sie brauchen nicht -rin , grepwenn auf Dateien verwendet (nur können Verzeichnisse durchsucht rekursiv werden)
Stuart Cardall
7
grep -A20 -B20 pattern file.txt

Suchmuster und zeige 20 Zeilen nach und vor dem Muster

Emilio
quelle
11
Dies ist überhaupt nicht das, wonach gefragt wurde.
Jonathon Reinhart
3
Auch -C20ist eine kürzere Version, wenn das ist, was gewünscht wurde
Marty Neal
0

grep -nr Verzeichnis "Suchzeichenfolge"

Dies gibt Ihnen die Zeile mit der Zeilennummer.

zufälliger Typ
quelle
0

Um die Ergebnisse mit den Zeilennummern anzuzeigen, können Sie dies versuchen

grep -nr "word to search for" /path/to/file/file 

Das Ergebnis sollte ungefähr so ​​aussehen:

linenumber: other data "word to search for" other data
Fouad Djebbar
quelle