Ich habe eine Datei, die möglicherweise eine schlechte Formatierung enthält (in diesem Fall das Auftreten des Musters \\backslash
). Ich möchte verwenden grep
, um nur die Zeilennummern zurückzugeben, in denen dies auftritt (wie in, die Übereinstimmung war hier, gehen Sie zu Zeile # x und korrigieren Sie sie).
Es scheint jedoch keine Möglichkeit zu geben, die Zeilennummer ( grep -n
) und nicht die Übereinstimmung oder Zeile selbst zu drucken .
Ich kann einen anderen regulären Ausdruck verwenden, um die Zeilennummern zu extrahieren, aber ich möchte sicherstellen, dass grep dies nicht alleine tun kann. grep -no
kommt am nächsten, denke ich, zeigt aber immer noch die Übereinstimmung.
grep -no
! Dies tat, was ich hierher kam, um zu versuchen und zu tun! (dh nicht die Zeile drucken, die manchmal sehr lang ist, z. B. in minimierten Javascript-Quelldateien.)Antworten:
Versuchen:
quelle
-f
param manipulieren . Für mich war es-f2
. (Wissen Sie, dass dies altes Zeug ist, aber ich denke, es könnte einigen armen Seelen helfen)grep -n "text to find" file.ext | cut -f1,2 -d:
zeigt den Dateinamen und die Zeilennummer.-H
zu erzwingen, dass der Dateiname angezeigt wird, wenn nur eine Datei vorhanden ist. Umgekehrt können Sie immer-h
angeben, dass der Dateiname nicht ausgegeben werden soll, unabhängig davon, wie viele Dateien Sie erfassen.Wenn Sie offen für die Verwendung von AWK sind:
In diesem Fall ist FNR die Zeilennummer. AWK ist ein großartiges Tool, wenn Sie sich grep | cut ansehen oder wenn Sie eine grep-Ausgabe nehmen und bearbeiten möchten.
quelle
NR
funktioniert auch, wenn nur eine Datei untersucht wird, wie in diesem Fall.Für all diese Antworten muss grep die gesamten übereinstimmenden Zeilen generieren und dann an ein anderes Programm weiterleiten. Wenn Ihre Zeilen sehr lang sind, ist es möglicherweise effizienter, nur sed zur Ausgabe der Zeilennummern zu verwenden:
quelle
Bash-Version
quelle
Ich empfehle die Antworten mit
sed
undawk
nur zum Abrufen der Zeilennummer, anstattgrep
die gesamte übereinstimmende Zeile abzurufen und diese dann mitcut
einem anderen Tool aus der Ausgabe zu entfernen . Der Vollständigkeit halber können Sie auch Perl verwenden:oder Ruby:
quelle
Sie wollen das zweite Feld nach dem Doppelpunkt, nicht das erste.
grep -n "text to find" file.txt | cut -f2 -d:
quelle
So zählen Sie die Anzahl der Zeilen, die dem Muster entsprechen:
Übereinstimmendes Muster extrahieren
Anzeigen von Zeilennummern, auf denen das Muster übereinstimmte
quelle
mit nur grep :
grep -n "text to find" file.ext | grep -Po '^[^:]+'
quelle