2016-09-01 3 views
3

Je tente de lire les fichiers de mon compartiment S3 et de les analyser avec un motif regex. Cependant, je n'ai pas été capable de comprendre lire les fichiers ligne par ligne. Existe-t-il un moyen de faire ceci ou d'une manière différente que j'ai besoin d'approcher ceci pour l'analyse syntaxique?Analyse des fichiers dans AWS S3 avec boto3

pattern = '^(19|20)\d\d[-.](0[1-9]|1[012])[-.](0[1-9]|[12][0-9]|3[01])[ \t]+([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9][ \t]+(?:[0-9]{1,3}\.){3}[0-9]{1,3}[ \t]+(?:GET|POST|PUT)[ \t]+([^\s]+)[ \t]+[1-5][0-9][0-9][ \t]+(\d+)[ \t]+(\d+)[ \t]+"(?:[^"\\]|\\.)*"[ \t]+"(?:[^"\\]|\\.)*"[ \t]+"(?:[^"\\]|\\.)*"' 

s3 = session.resource('s3') 
bucket_name = s3.Bucket(bucket) 
data = [obj for obj in list(bucket_name.objects.filter(Prefix=prefix)) if obj.key != prefix] 

for obj in data: 
    key = obj.key 
    body = obj.get()['Body'].read() 
    print(key) 
    print(body) 
    for line in body: 
     print(line) 

Je suis en mesure de voir le fichier correct et capable de lire le corps entier du fichier (près d'un journal IIS). Cependant, quand j'essaie d'itérer les lignes, j'obtiens des nombres. Ainsi, la sortie de print(line) est

35 
101 
119 
147 
etc. 

Je ne sais pas où ces chiffres viennent. Sont-ils des mots, des personnages, quelque chose d'autre?

Mon but est d'appliquer mon motif une fois que je suis capable de lire le fichier ligne par ligne avec l'opérateur d'expression régulière.

EDIT: Voici une de mes lignes de log

2016-06-14 14:03:42 1.1.1.1 GET /origin/ScriptResource.axd?=5f9d5645 200 26222 0 "site.com/en-US/CategoryPage.aspx" "Mozilla/5.0 (Linux; Android 4.4.4; SM-G318HZ Build/KTU84P)" "ASP.NET_SessionId=emfyTVRJNqgijw=; __SessionCookie=bQMfQzEtcnfMSQ==; __CSARedirectTags=ABOcOxWK/O5Rw==; dtCookie=B52435A514751459148783108ADF35D5|VVMrZVN1aXRlK1BXU3wx" 
+1

Veuillez vérifier ma réponse ci-dessous. –

Répondre

2

fichier texte avec le contenu ci-dessous, je l'ai utilisé en dessous de solution:

I love AWS. 
I love boto3. 
I love boto2. 

Je pense que le problème est avec la ligne:

for line in body: 

Il itère caractère par caractère au lieu de ligne par ligne.

C:\Users\Administrator\Desktop>python bt.py 
I 

l 
o 
v 
e 

A 
W 
S 
. 



I 

l 
o 
v 
e 

b 
o 
t 
o 
3 
. 



I 

l 
o 
v 
e 

b 
o 
t 
o 
2 
. 

C:\Users\Administrator\Desktop> 

Au lieu de cela, nous utilisons comme ci-dessous:

for line in body.splitlines(): 

alors la sortie se présente comme suit

C:\Users\Administrator\Desktop>python bt.py 
I love AWS. 
I love boto3. 
I love boto2. 

C:\Users\Administrator\Desktop> 

L'application ci-dessus les choses, j'ai essayé le code ci-dessous sur le fichier texte avec petit regex qui sera donner des versions boto à partir du fichier.

import re 
header = ['Date', 'time', 'IP', 'method', 'request', 'status code', 'bytes', 'time taken', 'referrer', 'user agent', 'cookie'] 
s3 = session.resource('s3') 
bucket_name = s3.Bucket(bucket) 
data = [obj for obj in list(bucket_name.objects.filter(Prefix=prefix)) if obj.key != prefix] 

for obj in data: 
    key = obj.key 
    body = obj.get()['Body'].read() 
    #print(key) 
    #print(body) 
    x=0 
    for line in body: 
     m = re.search(r'(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})\s+([\d\.]+)\s+([GET|PUT|POST]+)\s+([\S]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+([\S]+)\s+(\".*?\")\s+(.*)',line) 
     if m is not None: 
      for i in range(11): 
       print header[i]," - ",m.group(x) 
       x+=1 
     print "------------------------------------" 
     x=0 
+0

Merci pour le commentaire Dinesh. Je pense que j'ai un problème avec mon regex maintenant. Si j'essaye r'pattern 'j'obtiens l'erreur "ne peut pas utiliser un modèle de chaîne sur un objet semblable aux octets". Si j'utilise b'pattern 'je reçois "la fin inattendue de l'expression régulière" Le motif est dans ma question. Merci – maltman

+1

Regardera. Pouvez-vous partager des exemples de données dans un fichier pour lequel vous avez écrit regex? –

+0

Juste ajouté à la question – maltman