it-swarm.com.de

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

Ich habe eine Protokolldatei und möchte sie nach einer Zeichenfolge durchsuchen. Nur wenn diese Zeichenfolge gefunden wird, wird eine neue Datei erstellt. Wie kann ich das erreichen, sed scheint in diesem Fall nicht passend zu sein.

10
Jacknife

Nehmen Sie eine Kurzschlussbewertung nach grep vor:

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

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


Sie können auch die übliche touch /newfile Annäherung wählen oder bei bash eine leere Umleitung - >/newfile ausführen.

Nur zu beachten, wenn die Datei bereits existiert, würde touch nur die relevanten Zeitstempel ändern, ohne die Datei abzuschneiden. Die leere Umleitung >/newfile wird nicht bei allen Shells für unterwegs unterstützt (z. B. in zsh), bei denen Sie die EOF manuell senden müssen.

16
heemayl

Nur zum Spaß:

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

dabei wird 'string' durch die Zeichenfolge (Bedingung) ersetzt, 'logfile' wird durch den Pfad zur Protokolldatei ersetzt, 'newfile' wird durch den tatsächlichen Pfad zur zu erstellenden Datei ersetzt, und zwar in einfachen Anführungszeichen , wie im Beispiel.

6
Jacob Vlijm

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

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

$ 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 verwenden, um Folgendes zu speichern:

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

Sie sagen nicht, ob Sie eine neue leere Datei möchten oder ob Sie eine komplexere Verarbeitung benötigen, um die Datei zu erstellen.

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
0
Paddy Landau