63 votes

Comment recadrer (couper) des fichiers texte en fonction des numéros de ligne de début et de fin dans cygwin ?

J'ai quelques fichiers journaux d'environ 100 Mo chacun. Personnellement, je trouve qu'il est fastidieux de traiter des fichiers aussi volumineux. Je sais que les lignes de journal qui m'intéressent ne sont que de 200 à 400 lignes environ.

Quel serait le bon moyen d'extraire les lignes de journal pertinentes de ces fichiers, c'est-à-dire que je veux juste transférer la gamme des numéros de ligne vers un autre fichier.

Par exemple, les entrées sont :

filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number:   39276

Y a-t-il une commande que je peux exécuter dans cygwin pour cat seulement cette plage dans ce fichier ? Je sais que si je peux d'une manière ou d'une autre afficher cette plage dans stdout, je peux aussi la diriger vers un fichier de sortie.

Note : L'ajout de Linux pour plus de visibilité, mais j'ai besoin d'une solution qui pourrait fonctionner sous cygwin. (Habituellement, les commandes linux fonctionnent dans cygwin).

4 votes

Des fichiers journaux de 100Mb ne sont pas énormes ;-)

0 votes

Bien sûr, mais si vous devez en étudier certaines parties dans un éditeur comme notepad++, alors elles paraissent assez énormes :)

130voto

Johnsyweb Points 45395

Cela ressemble à un travail pour sed :

sed -n '8,12p' yourfile

...enverra les lignes 8 à 12 de la liste de contrôle de l'UE. yourfile à la norme.

Si vous voulez faire précéder le numéro de ligne, vous pouvez utiliser cat -n d'abord :

cat -n yourfile | sed -n '8,12p'

0 votes

@bits : Heureux d'aider. J'ai ajouté le cat de ma réponse pendant que vous tapiez ça. Peut-être que ça sera utile aussi.

2 votes

Je pense que la première solution qui n'implique pas cat est le plus approprié pour moi. Simple et concis.

13voto

David Points 1001

Vous pouvez utiliser wc -l pour calculer le nombre total de lignes.

Vous pouvez ensuite combiner head y tail pour arriver à la gamme que vous voulez. Supposons que le journal compte 40 000 lignes, vous voulez les 1562 dernières lignes, puis les 838 premières. Donc :

tail -1562 MyHugeLogFile.log | head -838 | ....

Ou il y a probablement un moyen plus simple d'utiliser sed o awk .

11voto

Dorian Points 2384

J'ai vu ce fil de discussion lorsque j'essayais de diviser un fichier en plusieurs fichiers de 100 000 lignes. Une meilleure solution que sed pour cela est :

split -l 100000 database.sql database-

Il donnera des fichiers comme :

database-aaa
database-aab
database-aac
...

5voto

thkala Points 36148

Que dites-vous de ça ?

$ seq 1 100000 | tail -n +10000 | head -n 10
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009

Il utilise tail pour sortir à partir de la 10 000e ligne et plus, puis head pour ne garder que 10 lignes.

Le même résultat (ou presque) avec sed :

$ seq 1 100000 | sed -n '10000,10010p'
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010

Celui-ci a l'avantage de vous permettre d'entrer directement la gamme de lignes.

0 votes

C'est une solution possible, mais cela nécessite que je calcule 39276-38438=838 . Parce que je vais devoir utiliser 838 comme entrée dans la tête. Je recherche une solution dans laquelle les paramètres d'entrée sont strictement les numéros de ligne de début et de fin, c'est-à-dire 38438 y 39276 .

1voto

Si vous n'êtes intéressé que par le les X dernières lignes vous pouvez utiliser la commande "tail" comme ceci.

$ tail -n XXXXX yourlogfile.log >> mycroppedfile.txt

Cela permettra de sauvegarder les dernières XXXXX lignes de votre fichier journal dans un nouveau fichier appelé "mycroppedfile.txt".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X