web-dev-qa-db-fra.com

Comment rogner (couper) les fichiers texte en fonction des numéros de lignes de départ et d'arrivée dans cygwin

J'ai peu de fichiers journaux d'environ 100 Mo chacun. Personnellement, je trouve difficile de traiter de tels fichiers. Je sais que les lignes de journal qui m'intéressent ne comptent qu'entre 200 et 400 lignes environ.

Quel serait un bon moyen d’extraire les lignes de journal relavant de ces fichiers, c’est-à-dire que je veux simplement diriger la plage de numéros de lignes vers un autre fichier.

Par exemple, les entrées sont:

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

Existe-t-il une commande que je peux exécuter dans cygwin pour cat sortir uniquement cette plage de ce fichier? Je sais que si je peux en quelque sorte afficher cette plage dans stdout, je peux également accéder à un fichier de sortie.

Remarque: Ajout de la balise Linux pour plus de visibilité, mais j'ai besoin d'une solution qui pourrait fonctionner dans cygwin. (Généralement, les commandes linux fonctionnent dans cygwin).

53
bits

Cela ressemble à un travail pour sed:

sed -n '8,12p' yourfile

... enverra les lignes 8 à 12 de yourfile à la sortie standard.

Si vous souhaitez ajouter le numéro de ligne en préfixe, vous pouvez utiliser d'abord cat -n:

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

Vous pouvez utiliser wc -l pour déterminer le nombre total de lignes.

Vous pouvez ensuite combiner head et tail pour obtenir la plage souhaitée. Supposons que le journal compte 40 000 lignes, vous voulez les 1562 dernières lignes, puis celles que vous voulez les 838 premières.

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

Ou bien, il existe probablement un moyen plus simple d'utiliser sed ou awk.

10
David

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

split -l 100000 database.sql database-

Cela donnera des fichiers comme:

database-aaa
database-aab
database-aac
...
7
Dorian

Et si vous voulez simplement couper une partie d'un fichier - par exemple des lignes 26 à 142 - et l'insérer dans un nouveau fichier: cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt

6
Marc Pe-Pe

Que dis-tu 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 afficher à partir de la 10 000e ligne, puis head pour ne conserver que 10 lignes.

Le même (presque) résultat 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 de saisir directement la plage de lignes.

4
thkala

Si vous êtes intéressé uniquement par les dernières X lignes , vous pouvez utiliser la commande "tail" comme ceci.

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

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

C'est un vieux fil mais j'ai été surpris que personne ne mentionne grep. L'option -A permet de spécifier un nombre de lignes à imprimer après une correspondance de recherche et l'option -B inclut des lignes avant une correspondance. La commande suivante générerait 10 lignes avant et 10 lignes après les occurrences de "ma chaîne de recherche" dans le fichier "mylogfile.log":

grep -A 10 -B 10 "ma chaîne de recherche" mylogfile.log

S'il existe plusieurs correspondances dans un fichier volumineux, la sortie peut rapidement devenir difficile à manier. Deux options utiles sont -n qui indique à grep d'inclure les numéros de ligne et --color qui met en évidence le texte correspondant dans la sortie.

S'il y a plus d'un fichier à rechercher, grep permet de répertorier plusieurs fichiers séparés par des espaces. Les caractères génériques peuvent également être utilisés. Mettre tous ensemble:

grep -A 10 -B 10 -n --color "ma chaîne de recherche" * .log someOtherFile.txt

0
hbolingbroke