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 1142
sich 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?
Antworten:
quelle
-r
wenn Sie mehrere Dateien angeben. Sie benötigen nur,-r
wenn Sie Verzeichnisse angeben.Zeilennummern werden gedruckt mit
grep -n
:Um nur die Zeilennummer (ohne die passende Zeile) zu erhalten, kann man verwenden
cut
:Linien , die kein Muster enthalten, werden gedruckt mit
grep -v
:quelle
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)grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
Wenn Sie nur die Zeilennummer möchten, gehen Sie wie folgt vor:
Beispiel:
quelle
awk -F: '{print $1}'
auch funktioniert und Sie brauchen nicht-r
in ,grep
wenn auf Dateien verwendet (nur können Verzeichnisse durchsucht rekursiv werden)Suchmuster und zeige 20 Zeilen nach und vor dem Muster
quelle
-C20
ist eine kürzere Version, wenn das ist, was gewünscht wurdegrep -nr Verzeichnis "Suchzeichenfolge"
Dies gibt Ihnen die Zeile mit der Zeilennummer.
quelle
Um die Ergebnisse mit den Zeilennummern anzuzeigen, können Sie dies versuchen
Das Ergebnis sollte ungefähr so aussehen:
quelle