2010-07-12 9 views
0

J'ai un script dans lequel un utilisateur fournit une date, une heure de début et une heure de fin. Le script prend ces valeurs et analyse un fichier journal pour rechercher des mots clés dans le fichier journal qui se trouvent dans la plage de temps. Lorsqu'un utilisateur utilise des heures AM (par exemple, de 07h00 à 09h00 - de 7h00 à 9h00) sous la forme d'une plage ou de PM (exemple: 1400 à 1600 - de 14h00 à 16h00), le script fonctionne correctement. quand ils utilisent une heure de début AM (commençant par un zéro - 0700) et une heure de fin (ne commence pas par zéro - 1000 (c'est 10h) le script ne fonctionne pas correctementComment rechercher une valeur de temps dans un fichier journal en utilisant shell et awk?

Voici la ligne en question que je vais avoir des problèmes avec

echo "Number of ${shipmentTags[$i]} shipments processed in \ 
    log file log$logDate/$logFileName is: 
    `cat $logDirectory/log$logDate/$logFileName | 
     awk -F":" '$1$2 >= '"$startTime"' && $1$2 <= '"$endTime"' {print $0}' | 
     grep ${shipmentStrings[$i]} | 
     wc -l`" 

Merci. Je l'ai recopié ici que quelques données factices de ce que le journal ressemblerait.

07:00:01.124 dfsdfjsdflkjsdfkljsdflkjEDIRequestServiceModule/Routedasdfkl 
07:05:02.123 fsldjfsdfskdfjsdfsdkfjEDIRequestServiceModule/Rouedsdfjsdfj 
07:10:33.233 sdkjfasdflkjasdfaskdfjasdfkljEDIRequestServiceModule/Routed 
09:30:02.222 sefsklfjsdfljksdfEDIRequestServiceModule/Routedasdfdf 
14:00:12.222 sdfsdfsdfsdfsdfsdfEDIRequestServiceModule/Routed sdfsdfs 
14:01:22.223 sdfsdfsdfsdfsdfsdfsdfEDIRequestServiceModule/Routed sdfsdfsdf 
17:00:22.222 sdfsdfsdfsdfsdfsdfEDIRequestServiceModule/Routedsdfsdfsdf 
18:00:33.333 sdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdf 

Si quelqu'un veut voir tout le script, juste répondre et je peux couper et le coller dans ici aussi bien

Répondre

1

Vous devez utiliser la transmission de variables AWK. Vous n'aurez pas à faire toutes ces citations embarrassantes.

awk -F":" -v start=$startTIME -v end=$endTime '$1$2 >= start && $1$2 <= end {print $0}' 

N'utilisez pas cat. Vous pouvez faire:

awk ... filename 

ou

< filename awk ... 

En outre, AWK peut faire le Grepping et comptant pour vous:

< $logDirectory/log$logDate/$logFileName awk -F":" -v start=$startTIME -v end=$endTime -v selection=${shipmentStrings[$i]} '$0 ~ selection { if ($1$2 >= start && $1$2 <= end) count++} END {print count}' 

En outre, vous devriez probablement utiliser une variable et de raccourcir votre echo. Et utiliser $() au lieu de contre-apostrophes:

shipmentcount=$(... awk ...) 
echo "Number of ... is: $shipmentcount" 

Ou même laisser la END clause dans le script AWK imprimer le message:

< $logDirectory/log$logDate/$logFileName \ 
awk ... -v file=$logDirectory/log$logDate/$logFileName \ 
    '... END {print "Number of "selection" shipments ... "file" ... is: " count}' 
+0

Salut Dennis, j'ai essayé vos modifications et je ne reçois pas les chefs d'accusation. Ils arrivent à zéro. Le problème que je rencontrais au départ était lorsque l'heure de début commence avec un zéro comme 7 heures, que l'utilisateur saisit comme 0700 et que l'heure de début est entrée comme n'importe quand après 0959. C'est quand le script ne fonctionnerait pas. Si les deux heures étaient après 0959 ou avant 0959, le script fonctionnerait. Faites-moi savoir si vous souhaitez que j'essaie de copier le script entier ici. Je me sens comme il ya un problème avec $ 1 $ 2 dans le script .. pour une raison quelconque, la comparaison avec la valeur du temps dans le fichier journal provoque prob – user389721

+0

@ user389721: Essayez ceci: 'startTime = 0700; endTime = 1000; echo "09: 30: 02.222 sefsk" | awk (le reste de ma première commande AWK) '. Vous devriez récupérer la chaîne complète en écho. Maintenant, essayez cela avec juste la partie AWK de la ligne que vous avez publiée. Rien n'est imprimé. Obtenez-vous les mêmes résultats de ces deux tests? ** Aussi, essayez d 'ajouter ceci dans votre script juste avant la ligne que vous avez publiée et essayez votre entrée avant 10/après 10 et publiez ce qui en sort: 'echo' start: .. $ {startTime} .. end:. $ {endTime} .. "' –

+0

Salut Dennis, j'ai fini par me débrouiller après avoir arraché mes cheveux. Voici ce que j'ai trouvé et ça fonctionne très bien. Je pourrais probablement le nettoyer un peu en utilisant plus de déclarations awk mais je vais prendre ce que j'ai.Voici la nouvelle ligne fixe: echo "Nombre d'envois $ {shipmentTags [$ i]} traités dans le fichier log $ logDate/$ logFileName est:' cat $ logDirectory/log $ logDate/$ logFileName | awk -F: - v début = $ startTime -v fin = $ endTime '(($ 1 $ 2) + 0)> = début && (($ 1 $ 2) + 0) <= fin {print $ 0}' | grep $ {shipmentStrings [$ i]} | wc -l' " Merci pour toute votre aide si ... cela me mène dans la bonne direction. – user389721

Questions connexes