Stampa un file saltando le prime X linee in Bash
Domanda
Ho un file molto lungo che voglio stampare ma saltando ad esempio le prime 1e6 righe. Guardo la pagina man di cat ma non ho visto alcuna opzione per farlo. Sto cercando un comando per fare questo o un semplice programma bash.
Soluzione
Avrai bisogno della coda. Alcuni esempi:
$ tail great-big-file.log
< Last 10 lines of great-big-file.log >
Se hai davvero bisogno di saltare un particolare numero di " prima " linee, usa
$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >
Cioè, se si desidera saltare N linee, si inizia a stampare la linea N + 1. Esempio:
$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >
Se vuoi vedere solo le ultime tante righe, ometti " + " ;:
$ tail -n <N> <filename>
< last N lines of file. >
Altri suggerimenti
Se hai GNU tail disponibile sul tuo sistema, puoi fare quanto segue:
tail -n +1000001 huge-file.log
È il carattere +
che fa quello che vuoi. Per citare dalla pagina man:
Se il primo carattere di K (il numero di byte o righe) è a `+ ', stampa a partire dall'elemento Kth dall'inizio di ciascun file.
Pertanto, come indicato nel commento, l'inserimento di +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 consiglierei di usare numeri interi.
Giusto per proporre un'alternativa sed
. :) Per saltare il primo milione di righe, prova |sed '1,1000000d'
.
Esempio:
$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
se vuoi saltare le prime due righe
tail -n +3 <filename>
se vuoi saltare la prima linea x
tail -n +$((x+1)) <filename>
Se vuoi vedere le prime 10 righe puoi usare sed come di seguito:
sed -n '1,10 p' myFile.txt
o se vuoi vedere le righe da 20 a 30 puoi usare:
sed -n '20,30 p' myFile.txt
Usa il sed delete
comando -n
con un indirizzo di intervallo . Ad 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 print con il flag <=>:
$ 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 utility GNU.
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):
edu@debian5:~$./script.sh 2 4 file.txt
Output di questo comando:
two
three
four
Naturalmente, puoi migliorarlo, ad esempio testando che tutti i valori degli argomenti sono previsti :-)
Puoi farlo usando i comandi head e tail:
head -n <num> | tail -n <lines to print>
dove num è 1e6 + il numero di righe che si desidera stampare.
sed -n '1d;p'
questo comando eliminerà la prima riga e stamperà il resto
cat < File > | awk '{if(NR > 6) print $0}'
Avevo bisogno di fare lo stesso e ho trovato questa discussione.
Ho provato " tail -n +, ma ha appena stampato tutto.
Più + righe hanno funzionato bene sul prompt, ma si è scoperto che si comportava in modo totalmente diverso quando eseguito in modalità senza testa (cronjob).
Finalmente ho scritto questo da solo:
skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"