Essayer de déboguer un problème avec un serveur et mon seul fichier journal est un fichier journal de 20 Go (sans horodatage même! Pourquoi les gens l'utilisent-ils System.out.println()
comme journal ? En production?!)
En utilisant grep, j'ai trouvé une zone du fichier que j'aimerais consulter, ligne 347340107.
Autre que de faire quelque chose comme
head -<$LINENUM + 10> filename | tail -20
... ce qui nécessiterait head
de lire les 347 millions de premières lignes du fichier journal, existe-t-il une commande rapide et facile qui transfèrerait les lignes 347340100 - 347340200 (par exemple) vers la console?
mise à jour J'ai totalement oublié que grep peut imprimer le contexte autour d'un match ... cela fonctionne bien. Merci!
Réponses:
avec GNU-grep, vous pourriez simplement dire
la source
J'ai trouvé deux autres solutions si vous connaissez le numéro de ligne mais rien d'autre (pas de grep possible):
En supposant que vous ayez besoin des lignes 20 à 40,
ou
la source
41q
à sed de quitter la ligne41
.méthode 3 efficace sur les fichiers volumineux
moyen le plus rapide d'afficher des lignes spécifiques
la source
Non, les fichiers ne sont pas adressables par ligne.
Il n'existe aucun moyen à temps constant pour trouver le début de la ligne n dans un fichier texte. Vous devez diffuser le fichier et compter les retours à la ligne.
Utilisez l'outil le plus simple / le plus rapide dont vous disposez pour faire le travail. Pour moi, utiliser
head
est beaucoup plus logique quegrep
, car ce dernier est beaucoup plus compliqué. Je ne dis pas "grep
est lent", ce n'est vraiment pas le cas, mais je serais surpris si c'est plus rapide quehead
dans ce cas. Ce serait un bughead
, en gros.la source
Qu'en est-il de:
Je ne l'ai pas testé, mais je pense que cela fonctionnerait.
la source
Je préfère juste entrer
less
et:43210
Faire la même choseet des trucs comme ça.
Encore mieux: appuyez sur vpour commencer l'édition (dans vim, bien sûr!), À cet endroit. Maintenant, notez qu'il
vim
a les mêmes raccourcis clavier!la source
Je diviserais d'abord le fichier en quelques fichiers plus petits comme celui-ci
puis grep sur les fichiers résultants.
la source
Vous pouvez utiliser la
ex
commande, un éditeur Unix standard (qui fait maintenant partie de Vim), par exempleafficher une seule ligne (par exemple 2ème ligne):
syntaxe sed correspondante:
sed -n '2p' file.txt
gamme de lignes (par exemple 2-5 lignes):
syntaxe sed:
sed -n '2,5p' file.txt
de la ligne donnée jusqu'à la fin (par ex. du 5e à la fin du fichier):
syntaxe sed:
sed -n '2,$p' file.txt
plusieurs gammes de lignes (par exemple 2-4 et 6-8 lignes):
syntaxe sed:
sed -n '2,4p;6,8p' file.txt
Les commandes ci-dessus peuvent être testées avec le fichier de test suivant:
Explication:
+
ou-c
suivi de la commande - exécutez la commande (vi / vim) après la lecture du fichier,-s
- mode silencieux, utilise également le terminal actuel comme sortie par défaut,q
suivi de-c
la commande pour quitter l'éditeur (ajouter!
pour forcer la fermeture, par exemple-scq!
).la source
Si votre numéro de ligne est 100 à lire
la source
Avoir
ack
Installation d'Ubuntu / Debian:
Exécutez ensuite:
Exemple:
De
$ man ack
:la source
--lines
paramètre a été supprimé.sed devra également lire les données pour compter les lignes. La seule façon dont un raccourci serait possible serait qu'il y ait un contexte / ordre dans le fichier pour fonctionner. Par exemple, s'il y avait des lignes de journal précédées d'une heure / date fixe, etc., vous pouvez utiliser l' utilitaire look unix pour rechercher binaire dans les fichiers des dates / heures particulières
la source
Utilisation
Ici, vous obtiendrez le numéro de ligne où la correspondance s'est produite.
Vous pouvez maintenant utiliser la commande suivante pour imprimer 100 lignes
ou vous pouvez également utiliser "sed"
la source
Avec
sed -e '1,N d; M q'
vous imprimerez les lignes N + 1 à M. C'est probablement un peu mieuxgrep -C
car il n'essaie pas de faire correspondre les lignes à un motif.la source
-e
est facultatif ici.En s'appuyant sur la réponse de Sklivvz, voici une fonction intéressante que l'on peut mettre dans un
.bash_aliases
fichier. Il est efficace sur les fichiers volumineux lors de l'impression de trucs à l'avant du fichier.la source
Pour afficher une ligne de a
<textfile>
par son<line#>
, procédez comme suit:Si vous voulez un moyen plus puissant pour montrer une gamme de lignes avec des expressions régulières - je ne dirai pas pourquoi grep est une mauvaise idée pour cela, cela devrait être assez évident - cette expression simple vous montrera votre gamme dans un passe unique qui est ce que vous voulez lorsque vous traitez avec ~ 20 Go de fichiers texte:
(astuce: si votre regex en contient
/
, utilisez quelque chose comme à lam!<regex>!
place)Cela imprimerait à
<filename>
partir de la ligne qui correspond<regex1>
jusqu'à (et y compris) la ligne qui correspond<regex2>
.Il ne faut pas un assistant pour voir comment quelques ajustements peuvent le rendre encore plus puissant.
Dernière chose: perl, car c'est un langage mature, a de nombreuses améliorations cachées pour favoriser la vitesse et les performances. Dans cette optique, cela en fait le choix évident pour une telle opération, car il a été initialement développé pour gérer de gros fichiers journaux, du texte, des bases de données, etc.
la source
Vous pouvez essayer cette commande:
la source
Facile avec perl! Si vous voulez obtenir les lignes 1, 3 et 5 d'un fichier, dites / etc / passwd:
la source
Je suis surpris qu'une seule autre réponse (par Ramana Reddy) ait suggéré d'ajouter des numéros de ligne à la sortie. Ce qui suit recherche le numéro de ligne requis et colore la sortie.
la source