[bash] empilage de grep

empilage de grep [bash] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 19-11-2009 à 16:16:30    

J'ai besoin de greper des fichiers log relativement conséquent (+ de 100Mo) pour récupérer des infos.
j'en suis arrivé a cette ligne mais je suis sûr que ça peut être optimisé, car là, c'est moche !

Code :
  1. cat file.log | grep 675 | grep 10.33.0.\... -o | grep -v 10.33.0.2 | grep -v 10:33 | sort | uniq > extract.log


une idée ?


---------------
Don't forget the GNU Power :)   /   LanParty sur Toulouse   /   Mon Feed-Back (2006 style)
Reply

Marsh Posté le 19-11-2009 à 16:16:30   

Reply

Marsh Posté le 19-11-2009 à 16:29:55    

useless cat is useless, déjà :o
après, ton 675 il correspond à quoi ? [:petrus dei]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 19-11-2009 à 16:40:06    

awk !
 
pour sortir seulement des lignes qui correspondent à des expressions régulières complexe, il n'y a rien de mieux que awk.
 
pour effectuer un traitement dessus, perl. (si ce n'est que pour afficher la ligne, perl sera un peu moins performant)
 
là ce qui est lent c'est les pipes, ça spawn à mort sur 100M de logs :o


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 19-11-2009 à 20:40:35    

tu pourrai filer un extrait de ton log, genre 20-30 lignes avec au moins 2 "bonnes réponses" ?
 
et pour satisfaire ma curiosité c'est pour quoi faire ? tu récupere des ip d'un log de quoi ? et 675 c'est le port ?  :pt1cable:  
 
j'ai bien une solution, enfin un début avec sed, mais bon faudrai un bout de ton log pour tester.

Reply

Marsh Posté le 19-11-2009 à 21:14:48    

Code :
  1. sed -n -e 's/\(675 \).*\(10\.33\.0\.[0-1][0-5][0-9]\)/\2/p' file.log
 

après comme je sais pas si tu as 675 et aussi 6759 ou autre, bref là je considère que tu prend que si c'est 675 exactement et je suppose qu'il est suivi d'un espace obligatoirement puis de trucs divers et varié ou non. ensuite je récupère les ips 10.33.0.(3 chiffres obligatoirement commencant par 0 ou 1 mais pas 2).

 

ceci remplace sans pipe :

Code :
  1. cat file.log | grep 675 | grep 10.33.0.\... -o | grep -v 10.33.0.2
 

une fois que tu aura filé un bout de ton log je completerai pour le grep -v  10:33 mais comme je sais pas ou il est. et si c'est une fin d'ip et le port par exemple.

 

bref plus d'info  :hello:

 

edit:
pour manier l'arme ultime sed : http://www.grymoire.com/Unix/Sed.html


Message édité par ducon3d le 19-11-2009 à 21:18:02
Reply

Marsh Posté le 20-11-2009 à 12:18:32    

Enfait c'est des log windows transmis à un serveur syslog.
Chaque ligne correspond a une entrée de l'eventlog.
 
Petite explication :
grep 675 sert à récupérer les lignes avec l'eventid 675
grep 10.33.0.\... -o  sert à récupérer toute les ip dans ces lignes
grep -v 10.33.0.2 sert à enlever l'ip du serveur qui est présente en début de chaque lignes
grep -v 10:33 car mon deuxième grep me remonte aussi autre chose que des IP, je ne sais pas pourquoi
sort | uniq bon la c'est clair, on vire les doubons et on trie
 
un exemple du log ICI


Message édité par y-master le 20-11-2009 à 15:09:14

---------------
Don't forget the GNU Power :)   /   LanParty sur Toulouse   /   Mon Feed-Back (2006 style)
Reply

Marsh Posté le 20-11-2009 à 13:42:12    

ton lien marche pas :)

Reply

Marsh Posté le 20-11-2009 à 15:09:27    

lien corrigé


---------------
Don't forget the GNU Power :)   /   LanParty sur Toulouse   /   Mon Feed-Back (2006 style)
Reply

Marsh Posté le 20-11-2009 à 17:04:10    

Code :
  1. sed -n -e 's/.*\(675\t\).*\(10\.33\.0\.[0-1][0-9][0-9]\).*/\2/p' file.log | sort -u > extract.log
 

test ca et compare avec time les 2 méthodes. histoire de savoir ce que ca donne sur un gros log
et si c'est vraiment ok aussi.

 

sinon je sais c'est moche mais il y a un seul pipe

Message cité 1 fois
Message édité par ducon3d le 20-11-2009 à 17:05:40
Reply

Marsh Posté le 23-11-2009 à 15:40:30    

ducon3d a écrit :

Code :
  1. sed -n -e 's/.*\(675\t\).*\(10\.33\.0\.[0-1][0-9][0-9]\).*/\2/p' file.log | sort -u > extract.log


 
test ca et compare avec time les 2 méthodes. histoire de savoir ce que ca donne sur un gros log
et si c'est vraiment ok aussi.
 
sinon je sais c'est moche mais il y a un seul pipe


Désolé mais je vais rester sur mon empilage de grep  :D :  
- ta commande a base de sed; 5min de traitement; aucun résultat probant :o  
- mon empilage de grep; 38sec de traitement; pile la liste d'ip que je cherche... :love:
 
edit : sur un fichier de 350mo quand même


Message édité par y-master le 23-11-2009 à 15:42:02

---------------
Don't forget the GNU Power :)   /   LanParty sur Toulouse   /   Mon Feed-Back (2006 style)
Reply

Marsh Posté le 23-11-2009 à 15:40:30   

Reply

Marsh Posté le 23-11-2009 à 15:41:15    

awk ou perl bordel


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 23-11-2009 à 15:42:59    

awk '{ if($14 == 675) { print $55 } }' /tmp/fuck


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 23-11-2009 à 15:53:12    

ok 15sec, you win :D
Je vais me plonger dans la doc de awk ;)


---------------
Don't forget the GNU Power :)   /   LanParty sur Toulouse   /   Mon Feed-Back (2006 style)
Reply

Marsh Posté le 23-11-2009 à 20:35:15    

depuis le temps que l'on me dis du bien de awk, j'ai toujours pas mis le nez dedans :sweat:  
 
par contre je comprend pas pourquoi la commande avec sed ne marche pas chez toi.
 
enfin bref, impressionant awk, vraiment je vais m'y coller
 
par curiosité, j'ai bidonné un log a partir du log que tu as filer et en changeant quelques ip, environ 100mo
j'ai testé les 3 awk grep sed (il arrivent dans cet ordre d'ailleurs (niveau temps), mais j'ai le même résultat de sortie.
 
je me coucherai moin con ce soir.
 :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed