cerca un file e crea un nuovo file solo se viene soddisfatta una condizione


10

Ho un file di log e voglio cercarlo per una stringa e solo se quella stringa trova un nuovo file da creare. Come posso raggiungere questo obiettivo, sed doenst sembra essere adatto in questo caso.


3
Usa grepper cercare. L' -qopzione sopprimerà tutto l'output e restituirà match / nonmatch tramite grepil codice di uscita, che è facilmente testabile.
Waltinator,

2
Potrebbe essere utile dirci qual è la condizione.
j0h

Risposte:


16

Esegui una valutazione del corto circuito dopo grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qnon produce alcun output su STDOUT, esce solo con lo stato di uscita 0se il pattern viene trovato sul file

  • Se viene trovato il modello ( &&), crea un file /newfileda : >/newfile.


Potresti anche optare per il solito touch /newfileapproccio, o su bashun reindirizzamento vuoto - >/newfilefarebbe altrettanto.

Solo per notare, se il file esiste già, touchcambierebbe solo i relativi timestamp senza troncare il file. E il reindirizzamento vuoto >/newfilenon è supportato su tutte le shell in movimento (ad es. In zsh), dove è necessario inviare manualmente l'EOF.


Che cosa :fa?
George Udosen,

5
@George :è una scorciatoia per true, è un comando no-op che esce sempre con lo stato di uscita 0.
heemayl

@heemayl Ha funzionato meglio fino ad oggi
Jacknife,

6

Solo per divertimento:

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

dove 'string'viene sostituito dalla stringa (condizione), 'logfile'viene sostituito dal percorso del file di registro, 'newfile'viene sostituito dal percorso effettivo del file per creare, tutto tra virgolette singole, come nell'esempio.


4

Puoi usare awk con il suo system()comando. Se /pattern/viene trovato, il blocco codice {}verrà eseguito, in questo caso chiamiamo touch /tmp/my_file.txttramite system()comando.

L'esempio seguente mostra la creazione di un file temporaneo se è presente il mio utente /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

In alternativa, potremmo usare il reindirizzamento per archiviare:

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

0

Non si dice se si desidera un nuovo file vuoto o se è necessaria un'elaborazione più complessa per creare il file.

Se il primo, la risposta di @heemayl è perfetta.

Altrimenti, usa un'istruzione if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.