Come faccio ad avere l’ultima riga non vuota di un file utilizzando la coda di Bash?

Come faccio ad avere l’ultima riga non vuota utilizzando tail in Bash shell?

Per esempio, my_file.txt assomiglia a questo:

ciao

hola

bonjour

(riga vuota)

(riga vuota)

Ovviamente, se faccio tail -n 1 my_file.txt mi metterò una riga vuota. Nel mio caso voglio ottenere bonjour. Come faccio a fare che?

  • che cosa succede se si dispone di spazi/schede alla fine del file?
InformationsquelleAutor Debugger | 2010-04-14



7 Replies
  1. 25

    Si può usare Awk:

    awk '/./{line=$0} END{print line}' my_file.txt

    Questa soluzione ha il vantaggio di utilizzare un solo strumento.

    • Lato negativo: non ha Bisogno di leggere TUTTO il file e assegnare OGNI LINEA di awk variabili -> Questo può essere molto di CPU e di i / o intensivo.
    • Sì, la soluzione è semplice, ma ben lungi dall’essere efficiente. Una efficace soluzione sarebbe aprire il file, cercare al fine di scansione e indietro.
  2. 33

    Utilizzare tac, in modo da non dovete leggere tutto il file:

    tac FILE |egrep -m 1 .
    • Su OS X, è gtac
    • non sulla Sierra, 2016.
    • provate a scorrere da destra a sinistra sul touchbar 😬
    • Quindi l’errore che gtac non è stato trovato non verrà mostrato @vault . . . 😉
    • il touchbar è anche leccare-in grado 👅. E, a proposito, questo ha funzionato per me su CEntOS 7.5 (il vagabondo casella di bento/centos-7.5).
    • Perché utilizzare egrep invece di grep? Non c’è nulla di “extended” nell’espressione regolare.

  3. 22

    Come circa usando grep per filtrare le righe vuote prima?

    $ cat rjh
    1
    2
    3
    
    
    $ grep "." rjh | tail -1
    3
    • o, invece di ‘gatto rjh | grep “.” | tail -1’ usa ‘grep . rjh | tail -1’
    • grep "." tecnica è molto utile, grazie
    • qualcuno potrebbe spiegare il grep “.” parte ?
    • In grep ".", il periodo è regex, che significa “qualsiasi carattere”. In regex una riga vuota ha un inizio (^), fine ($ o \n), ma nulla in mezzo, quindi un grep per il periodo restituisce solo le righe che contengono caratteri. E. g., non è in bianco.
    • Semplice > efficiente. Bonus: ... | grep \. | tail -1 un carattere più corta!
  4. 6

    Invece di tac è possibile utilizzare tail -r se disponibile.

    tail -r | grep -m 1 '.'
    • Quali versioni di tail(1) hanno il -r opzione? Quello in GNU coreutils non ce l’ha, cfr. debbugs.gnu.org/18808
    • Il problema di questa soluzione è che se il file che si esegue la scansione è uno script di shell file, quindi sarà solo il filtro l’eco di uscita piuttosto che l’effettivo contenuto del file, prova a: 1) creare un file di script con pochi e semplici comandi echo; 2) incollare il percorso completo del file nella console e digitando “| tail -1” alla fine; da notare che solo l’output dell’ultimo comando echo uscita, piuttosto che l’intero comando echo…
  5. 3

    se si desidera omettere eventuali spazi bianchi, vale a dire, spazi/schede alla fine della linea, non solo le righe vuote

    awk 'NF{p=$0}END{print p}' file
  6. 1

    Se tail -r non è disponibile e non hai egrep, le seguenti opere di bene:

    tac $FILE | grep -m 1 '.'

    Come si può vedere, si tratta di una combinazione di due delle precedenti risposte.

    • egrep è la stessa grep solo invece di dover mettere ... | grep "my[regex]Expr" hai solo bisogno di mettere ... | egrep my[regexExpr] è un po ‘ più complesso di quel che si può incorrere in un problema di sintassi, ma alcuni caratteri di escape dovrebbe fare il trucco.
  7. 0

    Di stampa l’ultimo visivamente riga non vuota:

    tac my_file.txt | grep -vm 1 '^[[:space:]]*$'

    o

    awk 'BEGIN{RS="\r?\n[[:space:]]*"}END{print}' my_file.txt

    Il \r? è probabilmente necessario per DOS/Windows, i file di testo.
    Le classi di caratteri quali [:space:] lavoro con GNU versioni di awk (cioè gawk) e grep almeno. Con alcune altre implementazioni è necessario enumerare i caratteri di spazio manualmente nel codice, vale a dire sostituire [:space:] da \t \n\f\r\v. Non so quale sarebbe il modo corretto di trattare con backspace caratteri (\b) nel file.

    Il seguente funziona solo con [:space:]:

    tac my_file.txt | grep -m 1 '[^[:space:]]'

Lascia un commento