Suchen Sie eine Datei und erstellen Sie eine neue Datei nur, wenn eine Bedingung erfüllt ist

10

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.

Jacknife
quelle
3
Verwenden Sie grepzu suchen. Die -qOption unterdrückt alle Ausgaben und gibt die Übereinstimmung / Nichtübereinstimmung über grepden Exit-Code zurück, der leicht zu testen ist.
Waltinator
2
Es kann hilfreich sein, uns den Zustand mitzuteilen.
j0h

Antworten:

16

Nehmen Sie eine Kurzschlussauswertung vor, nachdem grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qerzeugt keine Ausgabe auf STDOUT, wird nur mit dem Exit-Status beendet, 0wenn das Muster in der Datei gefunden wird

  • Wenn das Muster gefunden wird ( &&), erstellen Sie eine Datei /newfilemit : >/newfile.


Sie könnten auch den üblichen touch /newfileAnsatz wählen oder basheine leere Umleitung durchführen - >/newfilewürde dies auch tun.

Nur zu beachten, wenn die Datei bereits existiert, touchwürde nur die Änderung der relevanten Zeitstempel, ohne die Datei abzuschneiden. Und die leere Umleitung >/newfilewird nicht bei allen Shells unterstützt (z. B. in zsh), bei denen Sie den EOF manuell senden müssen.

heemayl
quelle
Was macht das :?
George Udosen
5
@ George :ist eine Abkürzung für true, es ist ein No-Op-Befehl, der immer mit dem Exit-Status 0 beendet wird.
heemayl
@heemayl Dies funktionierte am besten bis heute
Jacknife
6

Nur zum Spaß:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

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.

Jacob Vlijm
quelle
4

Sie können awk mit seinem system()Befehl verwenden. Wird der /pattern/gefunden, wird der Codeblock {}ausgeführt, in diesem Fall rufen wir touch /tmp/my_file.txtper system()Befehl auf.

Das folgende Beispiel zeigt das Erstellen einer temporären Datei, wenn mein Benutzer in vorhanden ist /etc/passwd.

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

Alternativ können wir die Umleitung zur Datei verwenden:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Sergiy Kolodyazhnyy
quelle
0

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:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Paddy Landau
quelle