Следуя старой традиции, вот версия кода Джонатана в awk: -)
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;
}
}'
Пример вывода как следующий
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"