[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 3.x
Linux 3.x
Messaggi: 977
Iscritto il: gio 1 set 2005, 0:00
Slackware: 12.0
Località: somewhere in the time

[bash] usare awk come wrapper file di testo

Messaggio 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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 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

Messaggio 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}'`

smtux
Linux 3.x
Linux 3.x
Messaggi: 977
Iscritto il: gio 1 set 2005, 0:00
Slackware: 12.0
Località: somewhere in the time

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

Messaggio 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

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

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

Messaggio 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`
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 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

Messaggio 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.

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

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

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

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

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

Messaggio 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]

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

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

Messaggio 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]
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

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

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

Messaggio 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?

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

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

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

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

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

Messaggio 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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 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

Messaggio 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.

smtux
Linux 3.x
Linux 3.x
Messaggi: 977
Iscritto il: gio 1 set 2005, 0:00
Slackware: 12.0
Località: somewhere in the time

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

Messaggio 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!

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

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

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

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

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

Messaggio da targzeta »

smtux ha scritto:...potreste gentilmente spiegarmi la sintassi che mi avete postato?...
Ma dello script di sed o di awk?

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi