Soluzione 1:
sed -n '10000000,10000020p' filename
Potresti essere in grado di velocizzarlo un po' in questo modo:
sed -n '10000000,10000020p; 10000021q' filename
In quei comandi, l'opzione -n
provoca sed
per "sopprimere la stampa automatica dello spazio pattern". Il p
comando "stampa[s] lo spazio del pattern corrente" e il q
comando "Esci immediatamente dallo script sed senza elaborare altri input..." Le virgolette sono tratte dal sed
man
pagina.
A proposito, il tuo comando
tail -n 10000000 filename | head 10
inizia dalla decimilionesima riga dalla fine del file, mentre il tuo comando "intermedio" sembrerebbe iniziare dal diecimilionesimo dall'inizio che sarebbe equivalente a:
head -n 10000010 filename | tail 10
Il problema è che per i file non ordinati con righe di lunghezza variabile qualsiasi processo dovrà passare attraverso il conteggio delle nuove righe. Non c'è modo di scorciatoia.
Se, tuttavia, il file è ordinato (ad esempio un file di registro con timestamp) o ha righe di lunghezza fissa, è possibile cercare nel file in base alla posizione di un byte. Nell'esempio del file di registro, puoi eseguire una ricerca binaria per un intervallo di volte come fa il mio script Python qui*. Nel caso del file a lunghezza record fissa, è davvero facile. Cerchi solo linelength * linecount
caratteri nel file.
Soluzione 2:
Ho scoperto il seguente uso di sed
sed -n '10000000,+20p' filename
Spero sia utile a qualcuno!
Soluzione 3:
Questa è la prima volta che scrivo qui! Comunque, questo è facile. Supponiamo che tu voglia estrarre la riga 8872 dal tuo file chiamato file.txt. Ecco come farlo:
cat -n file.txt | grep '^ *8872'
Ora la domanda è trovare 20 righe dopo questo. Per fare ciò fai
cat -n file.txt | grep -A 20 '^ *8872'
Per le righe attorno o prima, vedere i flag -B e -C nel manuale di grep.