Repository 32bit  Forum
Repository 64bit  Wiki

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

[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
smtux
Linux 2.6
Linux 2.6
 
Messaggi: 977
Iscritto il: mer ago 31, 2005 23:00
Località: somewhere in the time
Slackware: 12.0

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}'`
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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
smtux
Linux 2.6
Linux 2.6
 
Messaggi: 977
Iscritto il: mer ago 31, 2005 23:00
Località: somewhere in the time
Slackware: 12.0

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

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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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

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
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

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

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
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

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

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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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!
smtux
Linux 2.6
Linux 2.6
 
Messaggi: 977
Iscritto il: mer ago 31, 2005 23:00
Località: somewhere in the time
Slackware: 12.0

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: 6186
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

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

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti