J'ai un gros fichier texte (près de 3 Go) - c'est un fichier journal. Je veux obtenir des lignes de texte qui correspondent à une plage de dates de ce fichier, du 13 juillet au 19 juillet. Mon format de journal est:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
donc après grep
/ sed
il devrait être sorti comme ceci:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
Comment puis-je l'obtenir?
command-line
grep
sed
corey
la source
la source
Réponses:
Avec
grep
si vous connaissez le nombre de lignes que vous voulez, vous pouvez utiliser l'option contextuelle-A
pour imprimer des lignes après le motifqui vous donnera la ligne avec 2013-07-13 et les 3 lignes suivantes
avec
sed
vous pouvez utiliser les dates pour délimiter comme ceciqui imprimera toutes les lignes de la première ligne avec 2016-07-13 jusqu'au et y compris la première ligne avec 2016-07-19. Mais cela suppose que vous n'avez qu'une seule ligne avec 2016-07-19 (il n'imprimera pas la ligne suivante). S'il y a plusieurs lignes, utilisez la date suivante à la place et utilisez
d
pour en supprimer la sortiela source
Ce simple liner grep one suffira:
Fonctionne bien ici et il n'y a pas besoin de sed :)
Références:
la source
^
pour que cela fonctionne. Utilisation de Mac.awk
Solution:Imprime essentiellement n'importe quelle ligne de celle qui commence par
2016-07-13
celle qui commence par2016-07-19
la source
Toutes les autres réponses actuelles reposent sur le fait que les entrées du fichier journal sont triées chronologiquement ou sur le fait que la plage de dates peut être facilement mise en correspondance avec des expressions régulières. Si vous voulez une solution plus générique, nous devons faire plus de programmation.
Je présente ce script GNU AWK:
Vous fournissez l'heure de début et de fin via les variables
starttime
etendtime
dans un format quimktime
comprend (YYYY MM DD hh dd ss
). Ainsi, vous exécutez laawk
commande comme ceci, en supposant que le script Awk ci-dessus se trouve dans un fichier exécutablefilter-log-dates.awk
dans le répertoire de travail actuel et que le fichier journal estmylog.txt
:Notez que l'heure de fin est exclusive , c'est-à-dire que les enregistrements de journal valides doivent avoir un horodatage avant l'heure de fin.
Si votre format d'horodatage est différent, vous pouvez ajuster l'expression régulière transmise à la
match
fonction pour l'adapter.la source
Vous pouvez le faire par étapes. Trouvez le numéro de la première ligne correspondant à votre modèle de départ. Trouvez le numéro de la dernière ligne correspondant à votre motif de fin. Extrayez ensuite le test entre ces deux lignes. Cela peut être fait comme suit.
Cela pourrait être fait tout dans une
awk
commande mais les étapes peuvent le rendre plus facile à suivre. Dans awk, la variable NR est le numéro de ligne actuel, et comme aucune action n'a été spécifiée après le modèle (NR> = 1234 && NR <= 5678), l'action par défaut consiste à imprimer les lignes de cette plage.la source