Kent, grep --versionist das der Befehl, um die Grep-Version zu kennen? Wenn ja, funktioniert es nicht. Es konnte kein anderer Befehl gefunden werden, um die grep-Version zu kennen.
Vivek
2
gute Frage, aber 'Os Version' ist ein verwirrendes Beispiel Dateiname
HaveAGuess
1
Das Betriebssystem und die Version spielen hier keine Rolle.
MD XF
grep 'pattern' *
user0
Antworten:
430
Versuchen Sie diesen kleinen Trick, um zu glauben grep, dass es sich um mehrere Dateien handelt, sodass der Dateiname angezeigt wird:
Ja, es hat funktioniert. Können Sie mir bitte sagen, welche Bedeutung das Hinzufügen /dev/nulldieses Befehls hat?
Vivek
55
Wenn grepmehrere Dateinamen enthalten sind, werden die Dateinamen vor dem Abgleich automatisch angezeigt, bei einer einzelnen Eingabedatei wird der Dateiname jedoch weggelassen. Durch die Verwendung /dev/nullals zusätzliche Eingabedatei grep"denkt", dass es sich um mehrere Dateien handelt, aber / dev / null ist natürlich leer, so dass es nicht in der Übereinstimmungsliste angezeigt wird.
Scrutinizer
32
Die Verwendung von / dev / null ist ein cleverer Trick, aber ich denke, der Vorschlag unter dem Flag -H ist eine bessere Antwort.
JohnQ
22
OK, aber die -HOption für grep ist nicht Teil von POSIX, und das verwendete Betriebssystem ist Solaris 10, wobei weder das Standard-grep noch die POSIX-kompatible Version von grep die -HOption haben.
Scrutinizer
4
Dies ist wichtig, wenn Sie grep mit find verwenden, z. B. find . -name foo -exec grep pattern {} \;wenn viele Dateien fooin Ihrem Unterverzeichnis benannt sind und findimmer noch grepeine einzelne Datei zur Bearbeitung vorhanden ist. Der /dev/nullTrick scheint in allen Linux / Osx-Varianten zu funktionieren, die ich ausprobiert habe, also ein großes Lob! Hinweis Ich denke, das -Hist sauberer, aber wie unten erwähnt, wird es mit Ihrer Version von möglicherweise nicht unterstützt grep.
Jon V
296
Wenn Sie die Optionen haben -Hund -nverfügbar sind ( man grepist Ihr Freund):
@codeforester Ich kenne keine anderen greps, also weiß ich es nicht.
MD XF
2
Cool ! Dies funktionierte für Linux. Wenn Sie einen Mac verwenden, können Sie Coreutils mit Brew installieren. Und denken Sie daran, PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" zu Ihrer .bashrc
zw963
2
Dies hat (auch) in MinGW funktioniert (1.0.17, glaube ich).
Peter Mortensen
Es funktioniert bei mir mit dem eingebauten Mac grep (2.5.1-FreeBSD). Um das alternative grep von Homebrew zu verwenden, können Sie es auch ausführen brew install grepund dann einfach verwenden ggrep. PATH muss nicht geändert werden.
Wunder
5
Wie wäre es damit, was ich teilweise dank dieses Beitrags erreichen konnte?
Sie möchten mehrere Dateien finden, beispielsweise Protokolle mit unterschiedlichen Namen, aber einem Muster (z. B. filename=logfile.DATE), in mehreren Verzeichnissen mit einem Muster (z /logsapp1, /logsapp2. B. ). Jede Datei hat ein Muster, das Sie erfassen möchten (z. B. "init time"), und Sie möchten das Muster "init time"jeder Datei haben, aber wissen, zu welcher Datei sie gehört.
Oder einfach mit findfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Martin
1
Dies ist eine geringfügige Änderung gegenüber einer früheren Lösung. Mein Beispiel sucht nach stderr-Umleitung in Bash-Skripten:
grep '2>' $(find . -name "*.bash")
grep --version
grep --version
ist das der Befehl, um die Grep-Version zu kennen? Wenn ja, funktioniert es nicht. Es konnte kein anderer Befehl gefunden werden, um die grep-Version zu kennen.grep 'pattern' *
Antworten:
Versuchen Sie diesen kleinen Trick, um zu glauben
grep
, dass es sich um mehrere Dateien handelt, sodass der Dateiname angezeigt wird:So erhalten Sie auch die Zeilennummer:
quelle
/dev/null
dieses Befehls hat?grep
mehrere Dateinamen enthalten sind, werden die Dateinamen vor dem Abgleich automatisch angezeigt, bei einer einzelnen Eingabedatei wird der Dateiname jedoch weggelassen. Durch die Verwendung/dev/null
als zusätzliche Eingabedateigrep
"denkt", dass es sich um mehrere Dateien handelt, aber / dev / null ist natürlich leer, so dass es nicht in der Übereinstimmungsliste angezeigt wird.-H
Option für grep ist nicht Teil von POSIX, und das verwendete Betriebssystem ist Solaris 10, wobei weder das Standard-grep noch die POSIX-kompatible Version von grep die-H
Option haben.find . -name foo -exec grep pattern {} \;
wenn viele Dateienfoo
in Ihrem Unterverzeichnis benannt sind undfind
immer nochgrep
eine einzelne Datei zur Bearbeitung vorhanden ist. Der/dev/null
Trick scheint in allen Linux / Osx-Varianten zu funktionieren, die ich ausprobiert habe, also ein großes Lob! Hinweis Ich denke, das-H
ist sauberer, aber wie unten erwähnt, wird es mit Ihrer Version von möglicherweise nicht unterstütztgrep
.Wenn Sie die Optionen haben
-H
und-n
verfügbar sind (man grep
ist Ihr Freund):Optionen:
-H
ist eine GNU - Erweiterung, sondern-n
wird von POSIX spezifiziertquelle
-H
wird hier nicht unterstützt.Kein Trick nötig.
Mit Zeilennummern:
quelle
grep
s, also weiß ich es nicht.brew install grep
und dann einfach verwendenggrep
. PATH muss nicht geändert werden.Wie wäre es damit, was ich teilweise dank dieses Beitrags erreichen konnte?
Sie möchten mehrere Dateien finden, beispielsweise Protokolle mit unterschiedlichen Namen, aber einem Muster (z. B.
filename=logfile.DATE
), in mehreren Verzeichnissen mit einem Muster (z/logsapp1, /logsapp2
. B. ). Jede Datei hat ein Muster, das Sie erfassen möchten (z. B."init time"
), und Sie möchten das Muster"init time"
jeder Datei haben, aber wissen, zu welcher Datei sie gehört.Dann
outputfilename.txt
wäre das so etwas wieAllgemein
Erläuterung:
find
Der Befehl durchsucht die Dateinamen anhand des MustersDann
xargs -I{}
leitet Pipe diefind
Ausgabe an die um{}
welches die Eingabe für sein wird
grep ""pattern" {}
Dann der Trick, um
grep
die Dateinamen anzuzeigen\dev\null
und schließlich schreiben Sie die Ausgabe in Datei mit
tee outputfile.txt
Dies funktionierte für mich in
grep
Version 9.0.5 Build 1989.quelle
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Dies ist eine geringfügige Änderung gegenüber einer früheren Lösung. Mein Beispiel sucht nach stderr-Umleitung in Bash-Skripten:
grep '2>' $(find . -name "*.bash")
quelle
arbeitete für mich, um alle .txt-Dateien zu durchsuchen (geben Sie natürlich Ihren eigenen Suchwert ein).
quelle