Ich habe eine Protokolldatei und möchte sie nach einer Zeichenfolge durchsuchen. Nur wenn diese Zeichenfolge gefunden wird, muss eine neue Datei erstellt werden. Wie kann ich das erreichen? Sed doenst scheint in diesem Fall passend zu sein.
command-line
Jacknife
quelle
quelle
grep
zu suchen. Die-q
Option unterdrückt alle Ausgaben und gibt die Übereinstimmung / Nichtübereinstimmung übergrep
den Exit-Code zurück, der leicht zu testen ist.Antworten:
Nehmen Sie eine Kurzschlussauswertung vor, nachdem
grep
:grep -q
erzeugt keine Ausgabe auf STDOUT, wird nur mit dem Exit-Status beendet,0
wenn das Muster in der Datei gefunden wirdWenn das Muster gefunden wird (
&&
), erstellen Sie eine Datei/newfile
mit: >/newfile
.Sie könnten auch den üblichen
touch /newfile
Ansatz wählen oderbash
eine leere Umleitung durchführen ->/newfile
würde dies auch tun.Nur zu beachten, wenn die Datei bereits existiert,
touch
würde nur die Änderung der relevanten Zeitstempel, ohne die Datei abzuschneiden. Und die leere Umleitung>/newfile
wird nicht bei allen Shells unterstützt (z. B. inzsh
), bei denen Sie den EOF manuell senden müssen.quelle
:
?:
ist eine Abkürzung fürtrue
, es ist ein No-Op-Befehl, der immer mit dem Exit-Status 0 beendet wird.Nur zum Spaß:
Dabei
'string'
wird die Zeichenfolge (Bedingung)'logfile'
durch den Pfad zur Protokolldatei'newfile'
ersetzt und durch den tatsächlichen Pfad zur zu erstellenden Datei in einfachen Anführungszeichen ersetzt, wie im Beispiel.quelle
Sie können awk mit seinem
system()
Befehl verwenden. Wird der/pattern/
gefunden, wird der Codeblock{}
ausgeführt, in diesem Fall rufen wirtouch /tmp/my_file.txt
persystem()
Befehl auf.Das folgende Beispiel zeigt das Erstellen einer temporären Datei, wenn mein Benutzer in vorhanden ist
/etc/passwd
.Alternativ können wir die Umleitung zur Datei verwenden:
quelle
Sie sagen nicht, ob Sie eine neue leere Datei möchten oder ob Sie eine komplexere Verarbeitung zum Erstellen der Datei benötigen.
Wenn erstere, ist die Antwort von @heemayl genau richtig.
Verwenden Sie andernfalls eine if-Anweisung:
quelle