Solution 1 :
Je suppose que vous pouvez utiliser tail pour ne sortir que les 4 Go environ en utilisant le -c
commutateur
-c, --bytes=[+]NUM
sortir les NUM derniers octets ; ou utilisez -c +NUM pour sortir en commençant par l'octet NUM de chaque fichier
Vous pourriez probablement faire quelque chose avec dd aussi en définissant bs=1
et skip
vers le décalage que vous souhaitez démarrer, par exemple
dd if=file bs=1024k skip=12g | grep something
Solution 2 :
Je poste simplement ceci parce que certains des commentaires l'ont demandé.
Ce que j'ai fini par utiliser était (fichier de 15 Go). Cela a fonctionné très rapidement et m'a fait gagner beaucoup de temps.
tail -f -c 14G file | grep something
J'ai aussi fait un benchmark très rudimentaire sur le même fichier. J'ai testé :
grep xxx fichier
// a duré une éternité (> 5 minutes)dd if=fichier bs=1 sauter=14G | grep xxx
// très rapide <1 secqueue -c 14g | grep xxx
// assez rapide <2 sec
le tail
est juste un peu plus court.
NB : le suffixe utilisé g
et G
diffèrent par commande (Ubuntu 15.10)
Solution 3 :
Cela ne répond pas à la question du titre, mais cela fera ce que vous voulez faire. Utilisez tac pour inverser le fichier, puis utilisez grep pour trouver votre chaîne. Si votre chaîne n'apparaît qu'une seule fois ou un nombre de fois connu dans le fichier, laissez-la s'exécuter jusqu'à ce qu'elle trouve le nombre d'occurrences connu. De cette façon, si votre hypothèse sur l'endroit où il se trouve dans le fichier est incorrecte, il le trouvera toujours. Si vous voulez le limiter, vous pouvez utiliser head pour le faire. La commande principale irait entre le tac et le grep.
La commande ressemble donc à :
tac < logfile | grep myString