2010-09-15 8 views
1

Je collecte les informations d'utilisation usb de tous les utilisateurs et les convertis en fichiers CSV afin que je puisse les exporter dans une base de données. Le fichier texte d'entrée est la suivante: -Comment convertir un fichier texte en csv en utilisant AWK

USB History Dump 
by nabiy (c)2008 
(1) --- Kingston DataTraveler 130 USB Device 
instanceID: 0018F3D974B4A9C0E1760896&0 
ParentIdPrefix: 7&b62e00e&2 
Last Mounted As: \DosDevices\I: 
Driver:{4D36E967-E325-11CE-BFC1-08002BE10318}\0033 
Disk Stamp: 09/07/2010 15:07 
Volume Stamp: 09/07/2010 15:07 
(2) --- Kingston DataTraveler 2.0 USB Device 
instanceID: 001D0F1E35B25B8C1201011B&0 
ParentIdPrefix: 7&1f5848f3&0 
Driver:{4D36E967-E325-11CE-BFC1-08002BE10318}\0035 
Disk Stamp: 09/06/2010 15:18 
Volume Stamp: 09/06/2010 15:18 
(3) --- Maxtor OneTouch III USB Device 
instanceID: 044303E5&0 
ParentIdPrefix: 
Driver:{4D36E967-E325-11CE-BFC1-08002BE10318}\0032 
Disk Stamp: 09/10/2010 10:09 
Volume Stamp: 03/12/2010 10:42 

Comment puis-je analyser ce fichier afin que je puisse obtenir au format suivant:

hostname Devic_name instanceID ParentPrefix LastMountedAs Driver 
pcname kingston xxxx xxxxxxxxx xxxxxxxxxx xxxxxxxx 
pcname maxtor 0440xxx 4 d 367 08/07/2010 xxxxxxxx 
pcname kingston xxxxxxx xxxxxxx xxxxxxxxx xxxxxxxx 

Le nom de pc sera prise de commande du nom d'hôte.

La sortie souhaitée est au format CSV pour la base de données avec un script batch ou awk. Toute suggestion est grandement appréciée.

+2

Le format de sortie n'est pas montrer CSV. –

+0

Faut-il se tromper? Perl serait-il OK? –

Répondre

0

En utilisant Perl, cela pourrait être traité comme cela, la génération de données véritable CSV:

use strict; 
use warnings; 

my @keys = ("Device_Name", "instanceID", "ParentIdPrefix", 
      "Last Mounted As", "Driver"); 

my %values =(); 
my $host = qx/hostname/; 
chomp $host; 

while (<>) 
{ 
    chomp; 
    next unless m/^\(\d+\) ---/ || m/^[\w ]+:/; 
    if (m/\(\d+\) --- (\w+)/) 
    { 
     dump_entry(\%values); 
     %values =(); 
     $values{Device_Name} = $1; 
    } 
    else 
    { 
     my($key,$value) = split /:/; 
     $value =~ s/^\s+//; 
     $value =~ s/\s+$//; 
     $values{$key} = $value if $value ne ""; 
    } 
} 
dump_entry(\%values); 

sub dump_entry 
{ 
    my($ref) = @_; 
    my(%values) = %$ref; 
    return if (scalar(keys %values) == 0); 
    print qq%"$host"%; 
    foreach my $key (@keys) 
    { 
     my $value = $values{$key} // "--none--"; 
     print qq%,"$value"%; 
    } 
    print "\n"; 
} 

Exemple de sortie à partir du fichier de données donné:

"yourpcname","Kingston","0018F3D974B4A9C0E1760896&0","7&b62e00e&2","\DosDevices\I","{4D36E967-E325-11CE-BFC1-08002BE10318}\0033" 
"yourpcname","Kingston","001D0F1E35B25B8C1201011B&0","7&1f5848f3&0","--none--","{4D36E967-E325-11CE-BFC1-08002BE10318}\0035" 
"yourpcname","Maxtor","044303E5&0","--none--","--none--","{4D36E967-E325-11CE-BFC1-08002BE10318}\0032" 

Notez que les données sont présentées dans l'ordre de lecture, contrairement aux données de sortie de la question.

0

follwing l'ancienne tradition, voici une version awk du code de Jonathan :-)

cat tess |awk ' 
function cmd(E, A, this,v){ A[0]=0;while((E |getline v)>0)A[A[0]+=1]=v;A["RETURN_CODE"]=close(E);} 
# whatever cvs format you perfer. Here we used a traditional type, with 
# escape sequence when 0x22 or , is present. 
function cvs(s){gsub(",","\\,",s);gsub("\"","\\\"",s);return ((s)?"\""s"\"":"\"--none--\"");}; 
BEGIN{ 
    cmd("hostname",A);host=A[1]; 
    f=0; 
    n=0; 
    print "hostname Devic_name instanceID ParentPrefix LastMountedAs Driver ";# Header 
    while(1){ 
     while((getline r)>0){ 
      if(r~"^[(][0-9]*[)]"){n=1;break;} 
      if(r!~":")continue; 
      key = substr(r,match(r,"^[^:]*"),RLENGTH);sub("^:[ \t]*","",key); 
      match(r,"^[^:]*[:][ \t]*"); 
      value = substr(r,RSTART+RLENGTH);sub("[\t ]*$","",value); 
      A[key]=value; 
     } 
     if(f){ 
      print cvs(host)","cvs(A["devic_name"])","cvs(A["instanceID"])","cvs(A["ParentIdPrefix"])","cvs(A["Last Mounted As"])","cvs(A["Driver"]); 
      delete A; 
     } 
     if(!n)break; 
     if(n)n=0; 
     f=1; 
     sub("^[(][0-9]*[)][ \t]*---[ \t]*","",r); 
     sub("[ ]*USB Device[ ]*$","",r); 
     A["devic_name"] = r; 
     continue; 
    } 
}' 

Exemple sortie comme follwing

hostname Devic_name instanceID ParentPrefix LastMountedAs Driver 
"host","Kingston DataTraveler 130","0018F3D974B4A9C0E1760896&0","7&b62e00e&2","\DosDevices\I:","{4D36E967-E325-11CE-BFC1-08002BE10318}\0033" 
"host","Kingston DataTraveler 2.0","001D0F1E35B25B8C1201011B&0","7&1f5848f3&0","--none--","{4D36E967-E325-11CE-BFC1-08002BE10318}\0035" 
"host","Maxtor OneTouch III","044303E5&0","--none--","--none--","{4D36E967-E325-11CE-BFC1-08002BE10318}\0032" 
Questions connexes