Comment extraire le texte d'un fichier volumineux, en commençant par la première occurrence de string?

7

J'ai un fichier journal volumineux que je souhaite examiner. Toutes les mauvaises choses commencent à l'occurrence certaine d'une chaîne d'erreur. Je veux ensuite regarder les x dernières lignes à partir de ce point et voir ce qui pourrait avoir causé cette erreur. Je ne peux pas ouvrir le fichier avec mon éditeur de texte préféré, car il épuise toute la mémoire vive de la machine.

J'ai pensé que je pourrais peut-être trouver la ligne sur laquelle elle apparaît et utiliser ensuite un autre utilitaire pour obtenir les données d'une ligne x à une ligne y. Est-ce possible?

deed02392
la source

Réponses:

11

Vous pouvez simplement utiliser "grep" avec les options -A et / ou -B. Le commutateur -A lira le nombre X de lignes après l'erreur, donc c'est probablement ce que vous voulez, et le commutateur -B lira le nombre X de lignes avant l'erreur, vous ferez donc quelque chose comme ceci:

grep -A10 -B2 "string to find" /path/and/file.tofind

Pour trouver les 10 lignes qui apparaissent après "string to find", ainsi que les 2 lignes qui le précèdent.

Alternativement - et c'est probablement une solution bien pire, vous pouvez simplement utiliser "head" et "tail" pour trouver la première, puis la dernière partie du fichier souhaité, mais cela suppose que vous connaissiez les numéros de ligne. IE si vous avez un fichier de longue ligne et que vous voulez lire les lignes 500-510, vous pouvez essayer ceci:

head -510 /etc/file/to/search | tail -10

Ce qui extrairait d’abord les 510 premières lignes du fichier, puis lira les 10 dernières de ces lignes.

davidgo
la source
2
Si vous n'utilisez pas de motif regex, grep -F donnera les meilleures performances.
suspectus
C'est bien, je ne connaissais pas ces commutateurs. Au moment où vous avez répondu, j’avais atteint cet objectif en utilisant grep -n pour obtenir le numéro de ligne, et sed '#,#p' pour obtenir une plage de ligne. Si la chaîne d'erreur est fréquente, ces commutateurs renvoient-ils uniquement les lignes de la première occurrence? Puis-je utiliser m 1 pour y parvenir sinon?
deed02392