Stampa un file saltando le prime linee X in Bash

Ho un file molto lungo che voglio stampare ma saltare le prime linee 1e6 per esempio. Guardo la pagina man di cat ma non ho visto nessuna opzione per farlo. Sto cercando un comando per fare questo o un semplice programma bash.

Avrai bisogno di coda.

$ tail great-big-file.log < Last 10 lines of great-big-file.log > 

Se hai davvero bisogno di SALTA un determinato numero di linee, usa

 $ tail -n +  < filename, excluding first N lines. > 

Cioè, se vuoi saltare N linee, inizi a stampare la riga N + 1. Esempio:

 $ tail -n +11 /tmp/myfile < /tmp/myfile, starting at line 11, or skipping the first 10 lines. > 

Se vuoi solo vedere le ultime tante righe, ometti il ​​”+”:

 $ tail -n   < last N lines of file. > 

Se hai GNU Tail disponibile sul tuo sistema, puoi fare quanto segue:

 tail -n +1000001 huge-file.log 

È il carattere + che fa ciò che vuoi. Per citare dalla pagina man:

Se il primo carattere di K (il numero di byte o linee) è un ‘+’, stampa a partire dall’elemento Kth dall’inizio di ogni file.

Pertanto, come indicato nel commento, inserire +1000001 inizia a stampare con il primo elemento dopo le prime 1.000.000 di righe.

Il modo più semplice che ho trovato per rimuovere le prime dieci righe di un file:

 $ sed 1,10d file.txt 

Una versione meno dettagliata con AWK:

 awk 'NR > 1e6' myfile.txt 

Ma vorrei raccomandare l’uso di numeri interi.

Solo per proporre un’alternativa sed . 🙂 Per saltare prima un milione di righe, provare |sed '1,1000000d' .

Esempio:

 $ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d' 1000001 1000002 1000003 1000004 1000005 

Se vuoi vedere la prima riga puoi usare sed come di seguito:

 sed -n '1,10 p' myFile.txt 

oppure se vuoi vedere le righe da 20 a 30 puoi usare:

 sed -n '20,30 p' myFile.txt 

se vuoi saltare prima due righe
tail -n +3

se vuoi saltare la prima linea x
tail -n +$((x+1))

Questo script di shell funziona bene per me:

 #!/bin/bash awk -v initial_line=$1 -v end_line=$2 '{ if (NR >= initial_line && NR <= end_line) print $0 }' $3 

Utilizzato con questo file di esempio (file.txt):

 one two three four five six 

Il comando (estrarrà dalla seconda alla quarta riga nel file):

 [email protected]:~$./script.sh 2 4 file.txt 

Uscita di questo comando:

 two three four 

Certo, puoi migliorarlo, ad esempio testando che tutti i valori degli argomenti sono quelli attesi 🙂

Utilizzare il comando sed delete con un indirizzo range . Per esempio:

 $ sed 1,100d file.txt # Print file.txt omitting lines 1-100. 

In alternativa, se si desidera stampare solo un intervallo noto, utilizzare il comando di stampa con il flag -n :

 $ sed -n 201,300p file.txt # Print lines 201-300 from file.txt 

Questa soluzione dovrebbe funzionare in modo affidabile su tutti i sistemi UNIX, indipendentemente dalla presenza di utilità GNU.

Puoi farlo usando i comandi testa e coda:

 head -n  | tail -n  

dove num è 1e6 + il numero di righe che si desidera stampare.

 cat < File > | awk '{if(NR > 6) print $0}' 
 sed -n '1d;p' 

questo comando cancellerà la prima riga e stamperà il resto

Dovevo fare lo stesso e ho trovato questo thread.

Ho provato “tail -n +, ma ha appena stampato tutto.

Più linee hanno funzionato bene sul prompt, ma si è scoperto che si comportava in modo totalmente diverso quando si eseguiva la modalità headless (cronjob).

Finalmente l’ho scritto anch’io:

 skip=5 FILE="/tmp/filetoprint" tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"