Pagina 1 di 3

[bash] usare awk come wrapper file di testo

Inviato: sab 8 nov 2008, 12:07
da smtux
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

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

Inviato: sab 8 nov 2008, 13:31
da Mario Vanoni
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}'`

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

Inviato: lun 10 nov 2008, 7:39
da smtux
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

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

Inviato: lun 10 nov 2008, 8:22
da targzeta
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`

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

Inviato: lun 10 nov 2008, 10:55
da Mario Vanoni
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.

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

Inviato: lun 10 nov 2008, 11:06
da targzeta
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

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

Inviato: lun 10 nov 2008, 11:29
da conraid
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[/offtopic]

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

Inviato: lun 10 nov 2008, 12:16
da targzeta
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]
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\+//
[/offtopic]
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]
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[/offtopic]

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

Inviato: lun 10 nov 2008, 12:22
da conraid
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?

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

Inviato: lun 10 nov 2008, 13:46
da targzeta
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

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

Inviato: lun 10 nov 2008, 14:02
da conraid
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

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

Inviato: lun 10 nov 2008, 14:45
da Mario Vanoni
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.

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

Inviato: lun 10 nov 2008, 14:57
da smtux
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!

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

Inviato: lun 10 nov 2008, 14:59
da targzeta
Offtopic:
Mario Vanoni ha scritto:Offtopic: ...
Interessante e` la velocita` di esecuzione...
Offtopic:
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

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

Inviato: lun 10 nov 2008, 15:02
da targzeta
smtux ha scritto:...potreste gentilmente spiegarmi la sintassi che mi avete postato?...
Ma dello script di sed o di awk?

Spina