[bash] usare awk come wrapper file di testo

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
smtux
Linux 2.6
Linux 2.6
Messaggi: 977
Iscritto il: gio set 01, 2005 0:00
Slackware: 12.0
Località: somewhere in the time

[bash] usare awk come wrapper file di testo

Messaggioda smtux » sab nov 08, 2008 12:07

Salve,

vorrei usare awk come wrapper di un file di testo. In partica usare solo alcune info memorizzate nel file di testo. Queste info dovrebbero essere usate come input
all'interno dello script.
esempio file di testo (file.txt):

Codice: Seleziona tutto

ip:    192.168.1.0


script bash che usa awk e le info di cui sopra:

Codice: Seleziona tutto

#!/bin/sh
FILE="file.txt"

awk '/ip:/ { ipAddress =  $2 }' $FILE
echo $ipAddress

ifconfig eth0 $ipAddress up



non mi funziona ma non so perchè?
Ultima cosa, capisco che scomodare awk per questo è troppo ma vorrei usarlo lo stesso...

grazie per eventuali suggerimenti.


EDIT: il problema è che non riesco a lavorare con la variabile $ipAddress

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 2007 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] usare awk come wrapper file di testo

Messaggioda Mario Vanoni » sab nov 08, 2008 13:31

smtux ha scritto:Salve,

vorrei usare awk come wrapper di un file di testo. In partica usare solo alcune info memorizzate nel file di testo. Queste info dovrebbero essere usate come input
all'interno dello script.
esempio file di testo (file.txt):

Codice: Seleziona tutto

ip:    192.168.1.0


script bash che usa awk e le info di cui sopra:

Codice: Seleziona tutto

#!/bin/sh
FILE="file.txt"

awk '/ip:/ { ipAddress =  $2 }' $FILE
echo $ipAddress

ifconfig eth0 $ipAddress up



non mi funziona ma non so perchè?
Ultima cosa, capisco che scomodare awk per questo è troppo ma vorrei usarlo lo stesso...

grazie per eventuali suggerimenti.


EDIT: il problema è che non riesco a lavorare con la variabile $ipAddress


nello script bash
ipAddress=`awk '/ip:/ {print $2}'`

smtux
Linux 2.6
Linux 2.6
Messaggi: 977
Iscritto il: gio set 01, 2005 0:00
Slackware: 12.0
Località: somewhere in the time

Re: [bash] usare awk come wrapper file di testo

Messaggioda smtux » lun nov 10, 2008 7:39

Mario Vanoni ha scritto:
smtux ha scritto:Salve,

...
nello script bash
ipAddress=`awk '/ip:/ {print $2}'`


Facendo come mi suggerisci ottengo:

Codice: Seleziona tutto

./configLanScript-v00.sh: 13: 192.168.1.0: not found


dove alla riga 13 ho:

Codice: Seleziona tutto

ipAddress=`awk '/ip:/ {print $2}' $FILE`


questo errore non lo capisco :-k

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] usare awk come wrapper file di testo

Messaggioda targzeta » lun nov 10, 2008 8:22

A me lo script postato da Mario, copiato nel file casa.sh:

Codice: Seleziona tutto

#!/bin/sh
FILE="file.txt"

ipAddress=`awk '/ip:/ { print $2 }' $FILE`
echo $ipAddress
funziona bene, come dovrebbe funzionare:

Codice: Seleziona tutto

$> sh casa.sh
192.168.1.0

Avrai commesso qualche errore di distrazione :),
Spina

P.S. Ahh, ovviamente io ti consiglio l'analogo ma più leggero comando

Codice: Seleziona tutto

ipAddress=`sed /ip:/'{s/.*ip:\( \)\+//}' file.txt`
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 2007 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] usare awk come wrapper file di testo

Messaggioda Mario Vanoni » lun nov 10, 2008 10:55

spina ha scritto:A me lo script postato da Mario, copiato nel file casa.sh:

Codice: Seleziona tutto

#!/bin/sh
FILE="file.txt"

ipAddress=`awk '/ip:/ { print $2 }' $FILE`
echo $ipAddress
funziona bene, come dovrebbe funzionare:

Codice: Seleziona tutto

$> sh casa.sh
192.168.1.0

Avrai commesso qualche errore di distrazione :),
Spina

P.S. Ahh, ovviamente io ti consiglio l'analogo ma più leggero comando

Codice: Seleziona tutto

ipAddress=`sed /ip:/'{s/.*ip:\( \)\+//}' file.txt`


Domanda:

quale versione e` piu` leggibile, awk o sed?

Poi rileggendo il codice tra qualche mese/anno.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] usare awk come wrapper file di testo

Messaggioda targzeta » lun nov 10, 2008 11:06

Mario Vanoni ha scritto:...
Domanda:

quale versione e` piu` leggibile, awk o sed?

Poi rileggendo il codice tra qualche mese/anno.

Questa discussione l'abbiamo già affrontata Mario. Uno legge quello che sa leggere, per me sono leggibili entrambe allo stesso modo, per chi conosce solo sed è più leggibile quella con sed, per chi conosce solo awk è più leggibile quella con awk.

Non c'è solo un modo per fare le cose, tutti i modi sono validi! Ho semplicemente postato un alternativa motivata.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
conraid
Staff
Staff
Messaggi: 12660
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: [bash] usare awk come wrapper file di testo

Messaggioda conraid » lun nov 10, 2008 11:29

Offtopic: Stavo facendo delle prove con SED
Mi spiegate la differenza tra

Codice: Seleziona tutto

sed 's/^ip:\s\+//'   

e

Codice: Seleziona tutto

sed s/^ip:\s\+// 


Perché nel primo caso posso utilizzare \s\+ e funziona e nel secondo no? Mentre funzionerebbe con s/ip// per esempio

E come mai se abilito l'opzione per l'estensione delle regex (-r) \s non funziona ma "\ " sì?

Codice: Seleziona tutto

sed -r s/^ip:\ \+//


Sono dubbi teorici i miei, frutto della poca conoscenza di sed, e chiedo scusa per l'OT

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] usare awk come wrapper file di testo

Messaggioda targzeta » lun nov 10, 2008 12:16

conraid ha scritto:Offtopic: Stavo facendo delle prove con SED
Mi spiegate la differenza tra

Codice: Seleziona tutto

sed 's/^ip:\s\+//'   

e

Codice: Seleziona tutto

sed s/^ip:\s\+// 


Perché nel primo caso posso utilizzare \s\+ e funziona e nel secondo no? Mentre funzionerebbe con s/ip// per esempio

Offtopic: Non è un problema di sed, ma dell'espansione della shell, il primo lo hai protetto, il secondo no, quindi il secondo diventa:

Codice: Seleziona tutto

sed s/^ip:s+//
avresti dovuto usare:

Codice: Seleziona tutto

sed s/^ip:\\s\\+//

Per vedere cosa passi a sed, basta che usi il comando echo

Codice: Seleziona tutto

$> echo sed s/^ip:\s\+//
sed s/^ip:s+//

$> echo sed s/^ip:\\s\\+//
sed s/^ip:\s\+//


conraid ha scritto:Offtopic: E come mai se abilito l'opzione per l'estensione delle regex (-r) \s non funziona ma "\ " sì?

Codice: Seleziona tutto

sed -r s/^ip:\ \+//

....
Offtopic: Qui neanche hai protetto il codice dall'espansione e quindi diventa:

Codice: Seleziona tutto

sed -r s/^ip: +//

in questo caso funziona proprio perchè hai usato l'opzione -r, ti rimando alla lettura (breve) di

Codice: Seleziona tutto

info '(sed)Extended regexps'
(puoi copiare ed incollare su di un terminale il comando così com'è).

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
conraid
Staff
Staff
Messaggi: 12660
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: [bash] usare awk come wrapper file di testo

Messaggioda conraid » lun nov 10, 2008 12:22

Offtopic: Grazie
già che ci sono ne approfitto

e come mai hai usato le parentesi graffe (dovrebbero racchiudere un blocco di codice no?), in quella espressione non era implicito?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] usare awk come wrapper file di testo

Messaggioda targzeta » lun nov 10, 2008 13:46

conraid ha scritto:Offtopic: ...come mai hai usato le parentesi graffe (dovrebbero racchiudere un blocco di codice no?), in quella espressione non era implicito?

Offtopic: si, è implicito, la mia è solo abitudine (di solito scrivo script più complessi in cui se dimentichi le parentisi, non ci capisci più niente :))

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
conraid
Staff
Staff
Messaggi: 12660
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: [bash] usare awk come wrapper file di testo

Messaggioda conraid » lun nov 10, 2008 14:02

spina ha scritto:Offtopic: si, è implicito, la mia è solo abitudine (di solito scrivo script più complessi in cui se dimentichi le parentisi, non ci capisci più niente :))


Offtopic: capito :-)
thanks

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 2007 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] usare awk come wrapper file di testo

Messaggioda Mario Vanoni » lun nov 10, 2008 14:45

spina ha scritto:
Mario Vanoni ha scritto:...
Domanda:

quale versione e` piu` leggibile, awk o sed?

Poi rileggendo il codice tra qualche mese/anno.

Questa discussione l'abbiamo già affrontata Mario. Uno legge quello che sa leggere, per me sono leggibili entrambe allo stesso modo, per chi conosce solo sed è più leggibile quella con sed, per chi conosce solo awk è più leggibile quella con awk.

Non c'è solo un modo per fare le cose, tutti i modi sono validi! Ho semplicemente postato un alternativa motivata.

Spina


Hai ragione Emanuele!

Interessante e` la velocita` di esecuzione,
ai tempi di AT&T SVR3 sed era piu` veloce di [n]awk.
Allora preferivo anch'io sed, ma solo per multi-liner.

Con le macchine odierne
time one-liner awk oppure time one-liner sed,
usando gli script citati,
su due macchine 0m0.001s, ripetuto piu volte.

smtux
Linux 2.6
Linux 2.6
Messaggi: 977
Iscritto il: gio set 01, 2005 0:00
Slackware: 12.0
Località: somewhere in the time

Re: [bash] usare awk come wrapper file di testo

Messaggioda smtux » lun nov 10, 2008 14:57

grazie mille delle risposte.

Effettivamente awk è più leggibile (almeno per me)... non ho mai usato sed :oops: .

potreste gentilmente spiegarmi la sintassi che mi avete postato?
poi prometto che mi metto ad usralo, grazie!

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] usare awk come wrapper file di testo

Messaggioda targzeta » lun nov 10, 2008 14:59

Offtopic:
Mario Vanoni ha scritto:...
Interessante e` la velocita` di esecuzione...

Per me l'interessante è che uno sappia cosa fa :), poi come lo fa dipende esclusivamente dai propri gusti. Per quanto mi riguarda usare sed o awk per questo esempio è praticamente analogo, io preferisco usare sed solo per il motivo che ho citato.

Il bello è sapere che ci sono scelte diverse, perchè più ne conosci e più hai la libertà di scegliere, e questa è veramente la cosa più interessante.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] usare awk come wrapper file di testo

Messaggioda targzeta » lun nov 10, 2008 15:02

smtux ha scritto:...potreste gentilmente spiegarmi la sintassi che mi avete postato?...

Ma dello script di sed o di awk?

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti