AWK recherche dans un fichier a entete

AWK recherche dans un fichier a entete - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 11-03-2010 à 15:24:44    

Salut,
 
Je cehrche a me faire un script AWK assé particulier pour rechercher dans une fichier de log qui contient une entete.
Pas exemple :
 

nom       prénom        age
tata      Annabelle      12
Mireille  Math            3
tutu      berth          25


 
 
 
Je pourrais le faire avec $1, $2. mais le problème c'est que le fichier source est susceptible d'évoluer. j'aurais aimer le faire avec $nom $prenom,...
 
 
et j'ai pas trouvé de solution pour ca.  
 
 
une idée ?


---------------
#mais-chut
Reply

Marsh Posté le 11-03-2010 à 15:24:44   

Reply

Marsh Posté le 11-03-2010 à 15:26:00    

pour compliquer la chose, la ligne qui contient les entente est en fait la 4iem lignes du fichier


---------------
#mais-chut
Reply

Marsh Posté le 11-03-2010 à 16:11:20    

Z_cool a écrit :

pour compliquer la chose, la ligne qui contient les entente est en fait la 4iem lignes du fichier


Recuperer la ligne X
cat PWET|awk 'NR == X {print;}'  
 
PWET, c'est mon fichier texte, bien sûr.


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
Reply

Marsh Posté le 11-03-2010 à 22:51:58    

Fork Bomb a écrit :


Recuperer la ligne X
cat PWET|awk 'NR == X {print;}'  
 
PWET, c'est mon fichier texte, bien sûr.


Useless use of cat :

awk 'NR == X {print;}' PWET


---------------
La réponse est 42
Reply

Marsh Posté le 12-03-2010 à 11:31:48    

en fait, cela m'affiche la ligne X en question qui contient les noms de colonnes
 
a partir de ca, j'aimerais pourvoir  faire un :
 
awk '$prenom~/Math/ {print $age, $nom}' PWET
 
c'est possible ca ?
 


---------------
#mais-chut
Reply

Marsh Posté le 12-03-2010 à 12:38:06    

J'ai quasi trouvé :  
http://unstableme.blogspot.com/200 [...] r-awk.html


---------------
#mais-chut
Reply

Marsh Posté le 22-03-2010 à 19:24:20    

Pour recuperer un champ par son nom :

Code :
  1. #!/bin/gawk -f
  2. BEGIN{
  3.     c=0
  4. }
  5. {
  6.     if (NR==1) {
  7.         for (i=1; i<NF; i++) {
  8.             if ($i ~ var) {
  9.                 var=i
  10.             }
  11.         }
  12.     }
  13.     else {
  14.         if (NR > 1 && var>0 ) { print $var }
  15.     }
  16. }


 

Code :
  1. var=prénom <PATH/TO/script.awk> <FICHIER SOURCE>

Reply

Marsh Posté le 26-03-2010 à 12:38:28    

awk 'NR>k{print $k}' k=$(awk 'NR==4{ for (i=1;i<=NF;i++) { if ($i ~ "Math" ) {print i; exit;} } }' Fichier.log) Fichier.log


4 = n° de ligne où se trouvent les entêtes. A déterminer avec un grep si besoin de généraliser encore.
"Math": l'entête voulue contient "Math". On peut remplacer par un == pour un match exact.

Reply

Marsh Posté le 28-04-2010 à 15:00:00    

Re-salut tout le monde.

 


Bon, j'ai pas mal avancé sur mon problème mais je me retrouve face a un autre. En fait j'utilise AWK sous windows, avec la ligne de  commande :

 

awk -v date=%date% -v server=%COMPUTERNAME% -f c:\scriptawkConfig.txt L:\Proxylog\ISALOG_%lastDayLogFile%_WEB_00*.w3c

 


Le fichier c:\script\awkConfig.txt:

BEGIN  {
 F="\t" ; FS="\t"; OFS=";"; c=0
 print "clientIP", "csusername", "Fdate", "Ftime", "ThreatName", "csuri" ,"csreferred" > server"_Report_Virus_"date".csv"
 print "clientIP", "csusername", "Fdate", "Ftime", "csuri", "rip" > server"_Internet_Trafic_"date".csv"
 }

 

NR == 4 {
  for (i=1;i<=NF;i++) {  
   if ($i=="MalwareInspectionThreatLevel" )   { MalwareLevel=i }
   if ($i=="#Fields: c-ip" )     { clientIP=i }
   if ($i~/date/)       { Fdate=i }
   if ($i=="time" )      { Ftime=i }
   if ($i=="cs-referred" )      { csreferred=i }
   if ($i=="cs-username" )      { csusername=i }
   if ($i=="ThreatName" )      { ThreatName=i }
   if ($i=="cs-uri" )      { csuri=i }
   if ($i=="r-host" )      { rhost=i }
   if ($i=="r-ip" )      { rip=i }
   if ($i=="cs-referred" )      { csreferred=i }
   }
 }

 

NR > 4 &&  $MalwareLevel!~/-/ && $1!~/#/ {print $clientIP, $csusername, $Fdate, $Ftime, $ThreatName, $csuri ,$csreferred > server"_Report_Virus_"date".csv"}

 

NR > 4 && ($rip~/10.4.98.225/ || $rip~/10.4.98.227/) && $1!~/#/ { print $clientIP, $csusername, $Fdate, $Ftime, $csuri, $rip > server"_Internet_Trafic_"date".csv"}

  


Je génère donc deux fichiers CSV a partir d'un autre, mais tout deux sont placé dans le répertoire d'exécution, j'aurais voulus les mettre sur une autre partition avec un truc du genre :

.....> "d:\"server"_Internet_Trafic_"date".csv"


mais le "\" semble poser pas mal de problème.

 

une idée ?


Message édité par Z_cool le 28-04-2010 à 15:06:52

---------------
#mais-chut
Reply

Marsh Posté le 03-05-2010 à 09:55:07    

non ? plus d'idee ?


---------------
#mais-chut
Reply

Marsh Posté le 03-05-2010 à 09:55:07   

Reply

Marsh Posté le 03-05-2010 à 12:52:53    

C'est un caractère spécial, faut pas juste le doubler :??:

.....> "d:\\"server"_Internet_Trafic_"date".csv"

Reply

Sujets relatifs:

Leave a Replay

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