Rapide commande unix pour afficher des lignes spécifiques dans le milieu d'un fichier?
Essayez de déboguer un problème avec un serveur et mon seul fichier journal est un journal de 20 go fichier (sans les horodatages même! Pourquoi les gens utilisent System.out.println()
que l'exploitation forestière? Dans la production?!)
À l'aide de grep, j'ai trouvé une zone du fichier que j'aimerais prendre un coup d'oeil, ligne 347340107.
Autre que de faire quelque chose comme
head -<$LINENUM + 10> filename | tail -20
... qui nécessiterait head
de lire le premier 347 millions de lignes du fichier de log, il est facile et rapide de la commande qui permette de vidage de lignes 347340100 - 347340200 (par exemple) à la console?
mise à jour j'ai totalement oublié que grep pouvez imprimer le contexte autour d'un match ... cela fonctionne bien. Merci!
- J'imagine grep est à rechercher dans l'ensemble du fichier, il doit y avoir un cpu moins intensive façon de le faire.
- Voir aussi stackoverflow.com/questions/6022384/...
Vous devez vous connecter pour publier un commentaire.
avec GNU grep vous pourrait simplement dire
J'ai trouvé deux autres solutions si vous connaissez le numéro de la ligne, mais rien d'autre (pas de grep possible):
Si vous avez besoin de lignes de 20 à 40 ans,
ou
41q
instruire sed à quitter à la ligne41
.méthode 3 efficace sur les gros fichiers
moyen le plus rapide pour l'affichage des lignes spécifiques
Pas il n'y en a pas, les fichiers ne sont pas de ligne adressable.
Il n'existe pas de constante de temps moyen pour trouver le début de la ligne n dans un fichier texte. Vous devez flux à travers le fichier de comptage et des retours à la ligne.
Utilisation les plus simples et les plus rapides de l'outil que vous avez à faire le travail. Pour moi, à l'aide de
head
fait beaucoup plus de sens quegrep
, puisque ce dernier est beaucoup plus compliqué. Je ne dis pas "grep
est lent", il n'est vraiment pas, mais je serais surpris si c'est plus rapide quehead
pour ce cas. Ce serait un bug danshead
, dans le fond.Ce sujet:
Je n'ai pas tester, mais je pense que ce serait le travail.
Je préfère aller juste en
less
et:43210
à faire de mêmeet des trucs comme ça.
Encore mieux: appuyez sur v pour commencer le montage (dans vim, bien sûr!), à cet emplacement. Maintenant, notez que
vim
a les mêmes raccourcis clavier!J'aimerais tout d'abord diviser le fichier en plusieurs plus petits comme ce
et puis un grep sur des fichiers résultants.
Vous pouvez utiliser le
ex
de commande, un standard de l'éditeur Unix (partie de Vim maintenant), par exempleafficher sur une seule ligne (par exemple, 2ème):
correspondant sed syntaxe:
sed -n '2p' file.txt
gamme de lignes (par exemple de 2 à 5 lignes):
sed syntaxe:
sed -n '2,5p' file.txt
de la ligne jusqu'à la fin (par exemple, de la 5e à la fin du fichier):
sed syntaxe:
sed -n '2,$p' file.txt
ligne multiples gammes (par exemple, 2-4 et 6-8 lignes):
sed syntaxe:
sed -n '2,4p;6,8p' file.txt
Commandes ci-dessus peuvent être testés avec le test suivant fichier:
Explication:
+
ou-c
suivie par la commande exécuter le vi/vim) de commande après le fichier a été lu,-s
- mode silencieux, utilise également le terminal actuel comme une sortie par défaut,q
suivie par-c
est la commande pour quitter l'éditeur (ajouter!
de faire de quitter de force, par exemple-scq!
).Obtenir ack
ack-lignes=début-fin de nom de fichier
sed aurez besoin de lire les données trop pour compter les lignes.
La seule manière d'un raccourci serait possible d'y aurait-il à contexte/de la commande dans le fichier à utiliser. Par exemple, si il y avait des lignes de log préfixé fixe la largeur de l'heure/date etc.
vous pouvez utiliser le look utilitaire unix binaire de recherche sur les fichiers pour les dates/heures
Si votre numéro de ligne est de 100 à lire
Utilisation
Ici, vous obtiendrez le numéro de la ligne où le match s'est produite.
Maintenant, vous pouvez utiliser la commande suivante pour imprimer 100 lignes
ou vous pouvez utiliser "sed" ainsi
Avec
sed -e '1,N d; M q'
vous pourrez imprimer les lignes N+1 par l'intermédiaire de M. C'est sans doute un peu mieux alorsgrep -C
comme il n'a pas essayer de faire correspondre les lignes d'un modèle.-e
est facultatif ici.Bâtiment sur Sklivvz réponse, voilà une belle fonction, on peut mettre dans un
.bash_aliases
fichier. Il est efficace sur les gros fichiers lors de l'impression des trucs à partir de l'avant du fichier.Pour afficher une ligne à partir d'un
<textfile>
par son<line#>
, il suffit de faire ceci:Si vous voulez un moyen plus puissant pour afficher une plage de lignes avec des expressions régulières -- je ne dirai pas pourquoi la commande grep est une mauvaise idée pour ce faire, il devrait être assez évident-cette expression simple va vous montrer votre gamme en un seul passage, qui est ce que vous voulez lorsque vous traitez avec ~20 go de fichiers texte:
(astuce: si votre regex a
/
, utilisez quelque chose commem!<regex>!
à la place)Ce serait d'imprimer
<filename>
commence avec la ligne qui correspond à<regex1>
, jusqu'à (et y compris) la ligne qui correspond à<regex2>
.Il ne prend pas un assistant de voir comment quelques modifications pour le rendre encore plus puissant.
Dernière chose: perl, car c'est une langue matures, a beaucoup de caché améliorations pour favoriser la vitesse et la performance. Avec cela à l'esprit, il est le choix évident pour une telle opération car il a été initialement développé pour le traitement de gros fichiers journaux, textes, bases de données, etc.
Vous pouvez essayer cette commande:
Facile avec perl! Si vous souhaitez obtenir des lignes 1, 3 et 5 à partir d'un fichier, par exemple /etc/passwd:
Je suis surpris qu'un seul autre réponse (par Ramana Reddy) a proposé d'ajouter des numéros de ligne à la sortie. Les recherches suivantes sont nécessaires pour le numéro de ligne et de couleurs de la sortie.