2010-08-24 4 views
1

Je dois extraire des informations d'un fichier journal à l'aide d'un script shell (bash). Une ligne du fichier journal ressemble généralement à ceci:Sélectionnez les intervalles de temps à partir des fichiers journaux à l'aide de Bash

2009-10-02 15:41:13,796| some information 

De temps en temps, une telle ligne est suivie par quelques lignes donnant plus de détails sur l'événement. Ces lignes supplémentaires n'ont pas de format spécifique (en particulier elles ne commencent pas par un horodatage).

Je sais comment utiliser grep pour filtrer le fichier en fonction de mots-clés et d'expressions. Fondamentalement, ce qui me dérange, c'est que parfois je n'ai besoin de regarder que des intervalles spécifiques. Par exemple, je n'ai besoin de regarder que les événements qui se sont produits au cours des X dernières minutes. Je n'ai pas l'expérience des scripts shell, mais en raison de la complexité du format horaire, cela semble être une tâche plutôt difficile pour moi. D'un autre côté, je peux m'imaginer que ce n'est pas quelque chose d'inhabituel, alors je me demande s'il existe des outils qui peuvent me faciliter la tâche ou si vous pouvez me donner quelques conseils sur la façon de résoudre ce problème.

+0

Merci pour toutes les réponses. Malheureusement, beaucoup de choses ne sont pas supportées sur le serveur (pas de date avec le paramètre% s, pas de phython, systime() ne fonctionne pas non plus). J'ai décidé d'utiliser Perl maintenant, car il offre des fonctions de temps manquant qui manquent. Pourtant, vos commentaires m'ont donné beaucoup de conseils utiles! – bufferUnderrun

Répondre

1
gawk -F"[-: ]" 'BEGIN{ 
    fivemin = 60 * 60 * 5 #last 5 min 
    now=systime() 
    difference=now - fivemin 
} 
/^20/{ 
    yr=$1 
    mth=$2 
    day=$3 
    hr=$4 
    min=$5 
    sec=$5 
    t1=mktime(yr" "mth" "day" "hr" "min" "sec) 
    if (t1 >= difference) { 
    print 
    } 
}' file 
+0

@ ghostdog74: Cela ne semble pas gérer les lignes d'information supplémentaires que l'OP a dans son fichier journal. Je l'aime bien, cependant. –

0

Vous pouvez jeter un oeil à my Python program qui extrait les données des fichiers journaux basés sur une plage de temps. La spécification des dates n'est pas encore implémentée (elle est conçue pour examiner les 24 heures les plus récentes). Le format de l'heure attendue (par exemple Jan 14 04:10:13) est légèrement différent de ce que vous voulez, mais cela pourrait être adapté. Je ne l'ai pas testé avec des lignes non horodatées, mais il devrait tout imprimer dans la plage de temps spécifiée.

Cela vous donnera des informations sur l'utilisation:

timegrep.py --help 
1

En fait ce que je vais avoir des problèmes avec est que, parfois, je dois regarder à des intervalles spécifiques seulement.

Vous pouvez utiliser date pour convertir la signature de la date pour vous avec le paramètre %s:

%s  seconds since 1970-01-01 00:00:00 UTC 

Avec elle, nous pouvons faire une petite démonstration:

#!/bin/bash 

timespan_seconds=300 # 5 minutes 

time_specified=$(date +"%s" -d "2010-08-25 14:54:40") 

let time_now=$(date +"%s") 
let time_diff=($time_now - $timespan_seconds) 

if [ $time_specified -ge $time_diff ]; then 
     echo "Time is within range" 
fi 

Notez que ce doesn Ne pas aborder l'heure future.