Newsgroup: it.comp.os.linux.iniziare
Titolo: Awk e le variabili

Sono alle prese con uno bash script ed ho un problema con awk.
Al momento di stampare i valori di due campi di una riga di un file
di testo contenente il valore $variabile con l'istruzione:
cat file.txt| awk '/$variabile/ {print $2,$3}'
lo script bash mi restituisce un errore.
All'espressione $variabile vorrei che awk immettesse il valore della variabile
$variabile.
Cosa che awk non fa, neppure proteggendo l'argomento di awk  con
virgolette ".
Qualche idea?
-- 
~pingo~
Per risposte in e mail sostituire [
pingo.net
] con [
mailandnews.com
]

$variabile.
]zac[
Non e' molto chiaro, se il tuo intento e' di passare ad awk una
variabile dello script c'e' una opzione apposita, cerca con man awk o
info awk.

 Qualche idea?
 
il problema sono gli apici/virgolette o come li vuoi chiamare (*)
' - la shell non  interpreta (espande) tutto  cio` che e`  compreso tra
    questi apici
" - la shell interpreta (espande) tutto cio` che e` compreso tra questi
    apici
nella pratica:
var=pippo
cat file.txt| awk '/$variabile/ {print $2,$3}'
non sara` interpretato come:
cat file.txt| awk '/pippo/ {print $2,$3}'
d'altronde
cat file.txt| awk "/$variabile/ {print $2,$3}"
ha il seguente problema:
$variabiule viene interpretato correttamente
cat file.txt| awk "/pippo/ {print $2,$3}"
pero` anche  $2 e $3 verranno  interpretati come il secondo  ed il terzo
parametro del tuo script.
metto sulla strada giusta (man bash)
[ .... ]
Quotatura
La  Quotatura è  usata  per  togliere il  significato  speciale, per  la
shell,  di certi  caratteri  o  parole. La  quotatura  può essere  usata
per  disabilitare speciali  trattamenti  per i  caratteri speciali,  per
prevenire che  le parole riservate  siano riconosciute come tali,  e per
prevenire l'espansione di parametro.
Ciascuno  dei  metacaratteri  elencati  prima sotto  DEFINIZIONI  ha  un
significato speciale  per la shell  e deve  essere quotato se  esso deve
rappresentare se stesso. Vi sono  tre meccanismi di quotatura: caratteri
di escape, apostrofi, e virgolette.
Un backslash (\) non quotato è  il carattere di escape. Esso conserva il
valore letterale del successivo carattere, con l'eccezione di <newline>.
Se  vi  è una  coppia  \<newline>,  e il  backslash  non  è quotato,  il
\<newline>  è trattato  come  una continuazione  di  linea (cioè,  viene
realmente ignorato).
Racchiudere caratteri in apostrofi conserva  il valore letterale di ogni
carattere  all'interno. Un  apostrofo  non può  trovarsi tra  apostrofi,
nemmeno quando preceduto da un backslash.
Racchiudere  caratteri in  virgolette  conserva il  valore letterale  di
tutti  i  caratteri  all'interno,  con  le  eccezioni  di  $,  `,  e  \.
I  caratteri  $  e  `  conservano il  loro  significato  speciale  anche
tra  virgolette.  Il  backslash  mantiene il  suo  significato  speciale
solo  quando  seguito da  uno  dei  seguenti caratteri:  $,  `,  " ,  \,
o  <newline>.  Le virgolette  possono  essere  racchiuse fra  virgolette
facendole precedere da un backslash.
I parametri speciali * e @ hanno un significato speciale quando sono tra
virgolette (si veda PARAMETRI più avanti).
[ .... ]
michele
*) niente paura,  capire come  si usano  questi caratteri  e` il  primo
   scoglio da superare, quando si iniza a programmare in shell.
-- 
Mario Michele Macaluso     -o)  | If only Dionysus were alive!  Where would  
m.macaluso .@. 
libero.it
   /\\  | he eat?   -- Woody Allen                   
                          _\\_v |                                            
Kernel 2.2.14-5.0 on a i586     |                                            
(All addresses in headers are fake. Only one dot in signature.)

 tutti  i  caratteri  all'interno,  con  le  eccezioni  di  $,  `,  e  \.
-- 
Ikitt


La shell deve poter discriminare quando un carattere racchiuso fra apici
ha un valore speciale oppure no.
Con il singolo apice (apostrofo) questa discriminazione non viene fatta;
Con i doppi apici (virgolette) questa discriminazione viene fatta.
echo "valore variabile(pippo): $pippo"
la shell lo interpreta in questo modo:
v -> (valore letterale)
a ->    "       "
l ->    "       "
...
( -> (valore letterale e non valore speciale)
...
$ -> (valore speciale: inizia una variabile, devo leggere finche` non trovo
      un carattere che indica la fine della parola, poi cercare nella lista
      delle variabili e sostituirne il valore)
Io ho descritto, sinteticamente, l'azione  svolta dalla shell;
Il manuale ti dice quali sono le regole che sono applicate durante l'azione di
discriminazione.
Quindi, dire che la shell *interpreta* tutto cio` che e` compreso tra gli apici
e` ............. sbagliato?
In qualche modo deve sapere se un carattere e`:  $, `, \
e se non interpreta come fa`?
-- 
Mario Michele Macaluso     -o)  | Young men want to be faithful and are not; 
m.macaluso .@. 
libero.it
   /\\  | old men want to be faithless and cannot.   
                          _\\_v | -- Oscar Wilde                             
