AWK: come potrei riscrivere una riga di comando senza entrare ed uscire continuamente da BASH ad AWK?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2563
Iscrizione: domenica 17 febbraio 2008, 13:56

AWK: come potrei riscrivere una riga di comando senza entrare ed uscire continuamente da BASH ad AWK?

Messaggio da Sargonsei »

Salve a tutti.
Al fine di rilevare le nuove periferiche USB, ho messo a punto questa serie di comandi BASH:

Codice: Seleziona tutto

A1=`dmesg|grep found|grep idVendor|tail -1`; echo $A1; A2=`echo "$A1" | awk '{ sub(", idProduct=",":"); print; }'`; A3=`echo "$A2" | awk '{ sub("=",","); print; }'`; A4=`echo "$A3" | awk '{ sub(":",","); print; }'`; A0=`echo $A4|awk -F'usb ' '{print $2}'`; B0=`echo $A0|awk -F',' '{print $1}'`; C0=`echo $A0|awk -F',' '{print $4}'`; lsusb -vd "$C0"|head -17; lsusb -tvv |grep $B0 -B2
che funziona perfettamente, ma ho notato che va uso di una serie di istruzioni consecutive che fanno sì che ad ogni ; (puntoevirgola) BASH passa dati ad AWK che li elabora per poi consegnare il risultato a BASH; mi riferisco ai comandi consecutivi

Codice: Seleziona tutto

A2=`echo "$A1" | awk '{ sub(", idProduct=",":"); print; }'`; A3=`echo "$A2" | awk '{ sub("=",","); print; }'`; A4=`echo "$A3" | awk '{ sub(":",","); print; }'`; A0=`echo $A4|awk -F'usb ' '{print $2}'`
che, da quanto ho capito leggendo qui
https://it.wikipedia.org/wiki/Awk
dovrebbe essere possibile passare la variabile $A1 ad AWK, far fare ad AWK il lavoro, ed infine far ritornare il risultato nella variabile $A0
Purtroppo, non ho capito come si fa.
Qualcuno è in grado di aiutarmi?
Ringrazio sin d'ora chi mi aiuterà.

-*-
edit
Io sono arrivato al punto di farla diventare così

Codice: Seleziona tutto

A1=`dmesg|grep found|grep idVendor|tail -1`; echo $A1; A4=`echo "$A1" | awk '{ sub(", idProduct=",":"); sub("=",","); sub(":",","); print; }'`; A0=`echo $A4|awk -F'usb ' '{print $2}'`; B0=`echo $A0|awk -F',' '{print $1}'`; C0=`echo $A0|awk -F',' '{print $4}'`; lsusb -vd "$C0"|head -17; lsusb -tvv |grep $B0 -B2
ma, se ho ben capito quello che ho letto, dovrebbe essere possibile accorparla ulteriormente...
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 409
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: AWK: come potrei riscrivere una riga di comando senza entrare ed uscire continuamente da BASH ad AWK?

Messaggio da Lucio C »

Da dentro awk si possono invocare comandi usando "system" o anche direttamente e pipare il loro output in awk con "getline" (studiare a fondo la man page di awk e fare tante prove). Metto due estratti da un mio script awk ... di cui non ricordo i dettagli. E' delicato ricordarsi di chiudere il canale di i/o nel modo giusto. E escapare le quotes. Per prova ed errore.

Questo esegue un find e fa delle cose (lunghe) sul suo output

Codice: Seleziona tutto

#             scan the directory
              cmd = "find "argo" -mount -ls | sort"
              print "DOING "argo >>fil3
              while (cmd | getline != 0) {
                 codice omesso
              }
              close(cmd) 
Queato esegue un sum e passa da un file intermedio (fil4 contiene suo nome definito da qualche parte prima)

Codice: Seleziona tutto

cmd2="/usr/bin/sum \""s11"\""
u=system(cmd2" > "fil4)
while ((getline < fil4) > 0) { ck=$1 }
close(fil4)
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti