Risposte:
Puoi usarlo per eliminare le prime due righe:
tail -n +3 foo.txt
e questo per eliminare le ultime due righe:
head -n -2 foo.txt
(supponendo che il file finisca con \n
quest'ultimo)
Proprio come per l'uso standard di tail
e head
queste operazioni non sono distruttive. Utilizzare >out.txt
se si desidera reindirizzare l'output su un nuovo file:
tail -n +3 foo.txt >out.txt
Nel caso out.txt
esista già, sovrascriverà questo file. Utilizzare >>out.txt
invece di >out.txt
se si preferisce aggiungere l'output out.txt
.
head -n -2
non è compatibile con POSIX .
Se vuoi tutte le linee tranne la prima N-1, chiama tail
con il numero di linee +N
. (Il numero è il numero della prima riga che si desidera conservare, a partire da 1, ovvero +1 significa iniziare in alto, +2 significa saltare una riga e così via).
tail -n +3 foo.txt >>other-document
Non esiste un modo semplice e portatile per saltare le ultime N linee. GNU head
consente head -n +N
come controparte di tail -n +N
. Altrimenti, se hai tac
(ad esempio GNU o Busybox), puoi combinarlo con tail:
tac | tail -n +3 | tac
Portabilmente, puoi usare un filtro awk (non testato):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
Se si desidera rimuovere le ultime righe da un file di grandi dimensioni, è possibile determinare l'offset di byte del pezzo da troncare, quindi eseguire il troncamento con dd
.
total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
All'inizio non è possibile troncare un file, anche se è necessario rimuovere le prime righe di un file di grandi dimensioni, è possibile spostare i contenuti .
Dalla tail
pagina man (GNU tail
, cioè):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
Pertanto, quanto segue dovrebbe aggiungere tutto tranne le prime 2 righe di somefile.txt
a anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt
Per rimuovere le prime n righe è possibile utilizzare GNU sed. Ad esempio se n = 2
sed -n '1,2!p' input-file
La !
media "esclude questo intervallo". Come puoi immaginare, ad esempio puoi ottenere risultati più complicati
sed -n '3,5p;7p'
che mostrerà la riga 3,4,5,7. Più potere viene dall'uso delle espressioni regolari anziché dagli indirizzi.
Il limite è che i numeri delle linee devono essere conosciuti in anticipo.
sed 1,2d
? Di solito è più semplice. Inoltre, nulla nei tuoi esempi è specifico di GNU Sed; tutti i tuoi comandi utilizzano le funzionalità POSIX standard di Sed .
Mentre tail -n +4
l'output del file a partire dalla 4a riga (tutte tranne le prime 3 righe) è standard e portatile, la sua head
controparte ( head -n -3
tutte tranne le ultime 3 righe) non lo è.
Portabilmente, faresti:
sed '$d' | sed '$d' | sed '$d'
O:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(attenzione che su alcuni sistemi in cui sed
è presente uno spazio modello di dimensioni limitate, che non si adatta a grandi valori di n
).
O:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
Spero di aver capito chiaramente il tuo bisogno.
Hai diversi modi per completare la tua richiesta:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
Dove / etc / passwd è il tuo file
La seconda soluzione può essere utile se si dispone di file di grandi dimensioni:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
" .. Funziona con tutti gli interi negativi a parte i-n -0
quali non restituisce nulla , proprio come-n 0
farebbe (usando: head (GNU coreutils) 7.4) ... Comunque quando\n
è presente un trailing ,-n -0
stampa come ci si potrebbe aspettare dal-
. stampa l'intero file ... Quindi funziona per tutti i valori negativi diversi da zero .. ma-0
fallisce quando non c'è nessun trailing\n