Soluzione 1:
Immagino che potresti usare tail per produrre solo gli ultimi 4 GB o giù di lì usando -c
cambia
-c, --bytes=[+]NUM
emettere gli ultimi NUM byte; oppure usa -c +NUM per l'output che inizia con il byte NUM di ciascun file
Probabilmente potresti fare qualcosa anche con dd impostando bs=1
e skip
all'offset che vuoi iniziare, ad es.
dd if=file bs=1024k skip=12g | grep something
Soluzione 2:
Lo sto pubblicando solo perché alcuni dei commenti lo richiedevano.
Quello che ho finito per usare era (file da 15 GB). Ha funzionato molto velocemente e mi ha fatto risparmiare un sacco di tempo.
tail -f -c 14G file | grep something
Ho anche fatto un benchmark molto rudimentale sullo stesso file. Ho testato:
grepxxx
// ha impiegato per sempre (> 5 minuti)dd if=file bs=1 skip=14G | grep xxx
// molto veloce <1 seccoda -c 14g | grep xxx
// piuttosto veloce <2 sec
il tail
è solo un po' più breve.
NB: il suffisso utilizzato g
e G
differiscono per comando (Ubuntu 15.10)
Soluzione 3:
Questo non risponde alla domanda sul titolo, ma farà quello che vuoi fare. Usa tac per invertire il file, quindi usa grep per trovare la tua stringa. Se la tua stringa si verifica solo una volta o un numero noto di volte nel file, lasciala eseguire finché non trova il numero noto di occorrenze. In questo modo, se la tua ipotesi su dove si trova nel file non è corretta, lo troverà comunque. Se vuoi limitarlo, puoi usare head per farlo. Il comando head andrebbe tra tac e grep.
Quindi il comando è simile a:
tac < logfile | grep myString