web-dev-qa-db-fra.com

Grep dans un énorme fichier journal (> 14 Go) uniquement les derniers x Go?

J'ai besoin de rechercher quelque chose dans un énorme fichier journal (plus de 14 Go). Je suis sûr que c'est dans les 4 derniers Go environ.

Existe-t-il un moyen d'ignorer le premier X GB pour accélérer les choses?

34
Roger

Je suppose que vous pouvez utiliser tail pour ne produire que 4 Go environ en utilisant le -c commutateur

-c, --bytes = [+] NUM
affiche les derniers NUM 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 skiping au décalage que vous souhaitez commencer, par exemple.

dd if=file bs=1024k skip=12g | grep something
75
user9517

Je poste juste ceci parce que certains commentaires l'ont demandé.

Je finis par utiliser (fichier de 15 Go). Cela a fonctionné très rapidement et m'a fait gagner une tonne de temps.

tail -f -c 14G file | grep something

J'ai également fait un benchmark très rudimentaire sur le même dossier. J'ai testé:

grep xxx file
// a pris pour toujours (> 5 minutes)

dd if = fichier bs = 1 skip = 14G | grep xxx
// très rapide <1 sec

queue -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)

32
Roger

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 connu de fois dans le fichier, laissez-la s'exécuter jusqu'à ce qu'elle trouve le nombre connu d'occurrences. 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. Le commandement en chef irait entre le tac et le grep.

La commande ressemble donc à:

tac < logfile | grep myString
19
Itsme2003