[SHELL] récuperer les nieme caract. dans des chaine obtenue par | grep

récuperer les nieme caract. dans des chaine obtenue par | grep [SHELL] - Shell/Batch - Programmation

Marsh Posté le 15-12-2009 à 12:48:28    

Bonjour
 
J'essaie un traitement qui me semble un poil complexe, je sollicite votre aide.
Je trie dans un fichier texte des logs en fonction de critères bien défini comme ceci
 
cat fichier-log | grep critère1
 
j'aimerais rediriger le résultat de ce cat dans différents fichiers textes en fonction de 2 paramètres présents dans chacune des lignes, à une place bien précise : les 3 premier caractères de chaque ligne que je nomme pour l'exemple $m et les 5et6em caractères que je nomme $d .
Le but est que chaque ligne de log aille se copier dans le fichier texte nommé $m$d.log
 
il me manque donc un bout à ma commande
ya  
"cat fichier-log | grep critère1"
probablement aussi
" >> %m%d.log "
 
Vous pourriez m'aider ?


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 15-12-2009 à 12:48:28   

Reply

Marsh Posté le 15-12-2009 à 12:51:30    

Pourquoi un cat ?
Faire tout simplement

grep critere1 fichier-log

.
Pour récupérer un caractère, ou une sous chaine, utiliser cut.

Reply

Marsh Posté le 15-12-2009 à 13:57:20    

olivthill a écrit :

Pourquoi un cat ?
Faire tout simplement

grep critere1 fichier-log

.
Pour récupérer un caractère, ou une sous chaine, utiliser cut.


heu, savais pas qu'on pouvait appliquer grep direct sur un fichier.
 
comment je fais pour appliquer mon cut à chaque ligne extraite par grep et reverser ainsi chaque ligne dans le bon fichier ?
 
grep critere1 fichierlog >> `cut N-M`-`cut N'-M'`.log  :??:
Jsais pas pourquoi , mais je sens que je fais fausse route [:tinostar]


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 15-12-2009 à 18:06:19    

awk est ton ami.
 
tu dois pouvoir faire un truc du genre:
 

Code :
  1. awk '{system("echo $0 >> substr($0,N,M) " );}' fichier.log


Message édité par pataluc le 15-12-2009 à 18:06:47
Reply

Marsh Posté le 15-12-2009 à 20:35:55    

Vais lire le man pour essayer de comprendre la philosophie du truc, pasque là ca me semble flou :jap:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 21-12-2009 à 17:47:45    

putain mais awk c'est énorme  [:cerveau lent]


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 22-12-2009 à 11:41:53    

tuxbleu a écrit :

putain mais awk c'est énorme  [:cerveau lent]


et ouais!  :D

Reply

Marsh Posté le 22-12-2009 à 12:01:08    

et encore j'ai pas poussé les possibilités à l'extrême, mais en gros je choisi mon action en fonction de la présence où non de telle chaine de charactère à une position donnée, et ca gère bien.
 
Une idée par contre pour faire genre :
délimiteur":" , récupérer la variable $7, dans laquelle je cherche à tester le valeur pour un délimiteur";" la variable $4 ?  
 
un truc genre  
awk '[...]
$7=="condition1" { awk '...' print $7}  
 
:??:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 22-12-2009 à 13:25:11    

dans les scripts awk tu peux utiliser la fonction split.

Reply

Marsh Posté le 22-12-2009 à 13:58:36    

pataluc a écrit :

dans les scripts awk tu peux utiliser la fonction split.


 :jap:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 22-12-2009 à 13:58:36   

Reply

Marsh Posté le 05-01-2010 à 12:39:18    

J'up mon petit topic...
mes script avec awk ont tres bien fonctionnés... jusqu'àu 31/12...
Apres des petites recherches, je me rends compte que le problème vient que le fichier sur lequel j'applique awk est composé comme suit :
Dec espace 31:12:09 ...
Jan espace espace 4:01:09 ...
 
Le double espace vient foutre le bazard, car je fais :
awk 'BEGIN { FS="\ "}
$7=="...." { action}
 
or apparemment avec un double espace,  je dois décaler mon test d'un paramètre.
Je ne vais bien sur pas mondifier à la main mon script le 9 du mois et le 31, pour que ca marche.
Une idée pour qu'il ne tienne pas compte du double espace ?


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 13:18:48    

le double espace ne semble pas merder il le considère comme un simple (en tout cas dans mes tests) c'est pas plutôt un split ou un cut qui déconne? poste voir un morceau de ton script et de ton fichier à traiter stp...


Message édité par pataluc le 05-01-2010 à 13:18:56
Reply

Marsh Posté le 05-01-2010 à 14:17:50    

yep :
 
script en question :  
log.log est créé avant l'appel de ce script et est créé par un script genre "logtail /var/log/fichierdelog > /root/log/log.log

Code :
  1. #!/bin/bash
  2. grep ssh /root/log/log.log | grep maps -v > /root/log/temp_log
  3. awk 'BEGIN { FS="\ "}
  4. $7=="publickey" { print $9" : "$2" "$1" "$3" : "$6" "$10" "$11 }
  5. $6=="pam_unix(sshd:session):" { print $11" : "$2" "$1" "$3" : "$7" "$8 }
  6. ' /root/log/temp_log >> /root/log/log.auth
  7. /bin/cat /root/log/log.log >> /root/log/backlog/log_brut-`/bin/date +%F`.log
  8. /bin/cat /root/log/temp_log >> /root/log/backlog/log_trie-`/bin/date +%F`.log
  9. /bin/rm /root/log/log.log
  10. /bin/rm /root/log/temp_log


 
log.log ... Avec ca ca marche pas

Code :
  1. Jan  3 08:17:01 ****** CRON[1644]: pam_unix(cron:session): session opened for user root by (uid=0)
  2. Jan  3 08:17:01 ****** CRON[1644]: pam_unix(cron:session): session closed for user root
  3. Jan  3 09:17:01 ****** CRON[1650]: pam_unix(cron:session): session opened for user root by (uid=0)
  4. Jan  3 09:17:01 ****** CRON[1650]: pam_unix(cron:session): session closed for user root
  5. Jan  3 10:17:01 ****** CRON[1656]: pam_unix(cron:session): session opened for user root by (uid=0)
  6. Jan  3 10:17:01 ****** CRON[1656]: pam_unix(cron:session): session closed for user root


et ca marchait avec :

Code :
  1. Dec 31 08:17:01 ****** CRON[1644]: pam_unix(cron:session): session opened for user root by (uid=0)
  2. Dec 31 08:17:01 ****** CRON[1644]: pam_unix(cron:session): session closed for user root


 
Pour que ca marche avec janvier, je dois ajouter 1 à tous les paramètres  [:airforceone]


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 14:50:28    

ca marche chez moi, avec un awk 3.1.6 sous cygwin... :spamafote:

Reply

Marsh Posté le 05-01-2010 à 16:37:01    

merde....
Bon je vais régler ca à la porc avec "Si $7=="publickey" ...
puis Si $8=="publickey"...
Mais bon stun peu cracra..


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 16:38:31    

Bien sur le fichier d'exemple log.log que je donne ne produit rien en résultat, ya dans cet extrait aucune ligne qui ne remplie une condition.


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 16:44:47    

ouais j'avais traduit et remplacé sshd par cron pour checker le résultat...

Reply

Marsh Posté le 05-01-2010 à 16:46:02    

Comment je peux savoir ma version d'awk ? Ma netinstall est recente, mais why not...


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 16:46:48    

pataluc a écrit :

ouais j'avais traduit et remplacé sshd par cron pour checker le résultat...


 :jap:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 16:55:05    

Code :
  1. awk --version

Reply

Marsh Posté le 05-01-2010 à 17:55:32    

humm, je suis ptet boulet, masi ma debian em dis que c'est pas option. J'ai essayé apt-cache show awk, ca produit rien... humm..


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 05-01-2010 à 18:22:36    

Code :
  1. awk -W version

sinon

Reply

Marsh Posté le 05-01-2010 à 22:24:08    

j'ai parcouru le man de awk, j'ai bien vu cette option, mais je ne sais pas pourquoi, j'ai fais awk -W , ca m'a dit qu'il manquait un paramètre, j'ai pas cherché plus loin, je me suis dis que je me fourvoyais....
:jap:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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