web-dev-qa-db-fra.com

Grep pour plage de nombres

Comment rechercheriez-vous dans un fichier journal une plage de dates?

Le fichier journal ressemble à ceci:

01/14 00:00:01  INFO:     received connect request from 10.10.10.10 

Je dois condenser le journal à 10 minutes à partir de 8h25 et jusqu'à 8h35

Lorsque j'utilise l'egrep suivant, je trouve trop de résultats, tels que00:08:2501:08:25 ... 08:25:00 ..

Comment puis-je simplement obtenir 08:25:00 par 08:35:59

Ce que j'ai essayé

cat foo | egrep "08:2[5-9]|08:3[0-5]"
cat foo | egrep "08:2[5-9]:??|08:3[0-5]:??"
cat foo | egrep "08:2[5-9]:[0-9][0-9]|08:3[0-5]:[0-9][0-9]"
14
spuder

Cela devrait donner le résultat souhaité.

egrep "08:[2][5-9]:[0-5][0-9]|08:[3][0-5]:[0-5][0-9]" foo

L'utilisation de cat dans ce cas n'est pas nécessaire.

10
Timothy Martin

Avec ces entrées:

01/15 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:25:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:35:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10

Vous pouvez imprimer toutes les lignes entre deux motifs en utilisant awk:

awk -v date='01/14' '$1!=date{next};/08:25/,/08:35/' logfile

01/14 08:25:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:35:01  INFO:     received connect request from 10.10.10.10
4
cuonglm

Si vous êtes prêt à utiliser sed, vous pouvez faire:

sed -n '/^01\/14 08:00/,/^01\/14 08:10/p' foo

En général, vous pouvez utiliser les variables bash à remplacer par les heures spécifiques dans la commande ci-dessus. Par exemple:

st="01\/14 08:00"
en="01\/14 08:25"
sed -n "/^$st/,/^$en/p" foo #note the double quotes

Vous devez échapper au / caractère avec \ si vous utilisez / comme séparateur comme indiqué dans la commande ci-dessus.

2
mkc

Vous pouvez utiliser Perl. Ce qui suit effectue une comparaison lexicale sur le champ d'heure, ce qui implique que cela fonctionnerait même si vous n'avez pas de ligne contenant l'heure de début ou de fin.

 yourprogram | Perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00"'

Cela suppose que l'heure est le deuxième champ de votre entrée et a la forme hh:mm:ss.

Vous pouvez également spécifier la date en ajoutant une autre condition:

 yourprogram | Perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00" and $F[0] eq "01/14"'

L'entrée est générée à l'aide du script suivant:

for ((h=8;h<9;h++)); do
  for ((m=20;m<40;m=m+2)); do
    for ((s=0;s<60;s=s+10)); do
      printf "01/14 %02d:%02d:%02d line %d\n" $h $m $s $((++l))
    done
  done
done

Exécution

bash script | Perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00"'

produit:

01/14 08:26:00 line 19
01/14 08:26:10 line 20
01/14 08:26:20 line 21
01/14 08:26:30 line 22
01/14 08:26:40 line 23
01/14 08:26:50 line 24
01/14 08:28:00 line 25
01/14 08:28:10 line 26
01/14 08:28:20 line 27
01/14 08:28:30 line 28
01/14 08:28:40 line 29
01/14 08:28:50 line 30
01/14 08:30:00 line 31
01/14 08:30:10 line 32
01/14 08:30:20 line 33
01/14 08:30:30 line 34
01/14 08:30:40 line 35
01/14 08:30:50 line 36
01/14 08:32:00 line 37
01/14 08:32:10 line 38
01/14 08:32:20 line 39
01/14 08:32:30 line 40
01/14 08:32:40 line 41
01/14 08:32:50 line 42
01/14 08:34:00 line 43
01/14 08:34:10 line 44
01/14 08:34:20 line 45
01/14 08:34:30 line 46
01/14 08:34:40 line 47
01/14 08:34:50 line 48
1
devnull