(5 risposte)
Chiuso 2 anni fa.
Ho un file che contiene più occorrenze del pattern “====” . Questi modelli sono seguiti da testi. Vorrei cercare l'ultima occorrenza di “====” motivo e stampa tutte le linee dopo il motivo. Qualche idea su come farlo in bash? Combinazione di grep
, awk
, sed
o tail
, ecc.?
File di esempio:
====
First run of script
End of first Script
====
2nd run of script
End of 2nd script
====
3rd run of script
End of 3rd script
L'output del comando dovrebbe apparire come di seguito.
3rd run of script
End of 3rd script
Risposta accettata:
Metodo degli strumenti software, più efficiente per file di grandi dimensioni poiché legge solo la fine del file, quindi si interrompe quando trova l'ultima corrispondenza:
tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac
Nota:aumenta o riduci 999999
se necessario, solo così è più lungo di qualsiasi possibile corrispondenza. Questo codice funzionerebbe meglio se è noto in anticipo che l'ultima corrispondenza è nota per essere vicina alla fine di un file di grandi dimensioni. Vedi anche Glenn Jackman La risposta con le varianti per awk
e sed
che evitano la necessità di 999999
. Per i sistemi con risorse molto basse, grep
è più efficiente di awk
o sed
.
Per evitare di indovinare, alcuni hanno aggiunto stat
la bruttezza funzionerebbe:
f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac