Inserimento di variabili shell awk
può essere fatto in diversi modi. Alcuni sono migliori di altri. Questo dovrebbe riguardare la maggior parte di essi. Se hai un commento, ti preghiamo di lasciare qui sotto. v1.5
Utilizzo -v
(il modo migliore, il più portatile)
Usa l' -v
opzione: (PS usa uno spazio dopo -v
o sarà meno portatile. Ad esempio, awk -v var=
no awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Questo dovrebbe essere compatibile con la maggior parte awk
e la variabile è disponibile anche nel BEGIN
blocco:
Se hai più variabili:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Attenzione . Come scrive Ed Morton, le sequenze di escape verranno interpretate in modo da \t
diventare reali tab
e non \t
se questo è ciò che cerchi. Può essere risolto utilizzando ENVIRON[]
o accedendo tramiteARGV[]
PS Se ti piacciono tre barre verticali come separatore |||
, non può essere sfuggito, quindi usa-F"[|][|][|]"
Esempio su come ottenere dati da una locanda di programma / funzione awk
(qui viene utilizzata la data)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Variabile dopo il blocco di codice
Qui otteniamo la variabile dopo il awk
codice. Funzionerà perfettamente finché non avrai bisogno della variabile nel BEGIN
blocco:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Aggiunta di più variabili:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- In questo modo possiamo anche impostare diversi Field Separator
FS
per ogni file.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- La variabile dopo il blocco di codice non funzionerà per il
BEGIN
blocco:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Qui-string
La variabile può anche essere aggiunta awk
all'utilizzo di una stringa qui dalle shell che le supportano (incluso Bash):
awk '{print $0}' <<< "$variable"
test
Questo è lo stesso di:
printf '%s' "$variable" | awk '{print $0}'
PS questo tratta la variabile come input di file.
ENVIRON
ingresso
Come scrive TrueY, è possibile utilizzare ENVIRON
per stampare le variabili di ambiente . Impostando una variabile prima di eseguire AWK, puoi stamparla in questo modo:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
ingresso
Come scrive Steven Penny, puoi usare ARGV
per ottenere i dati in awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Per ottenere i dati nel codice stesso, non solo BEGIN:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Variabile all'interno del codice: UTILIZZARE CON ATTENZIONE
Puoi usare una variabile all'interno del awk
codice, ma è disordinata e difficile da leggere e, come Charles Duffy
sottolinea, questa versione potrebbe anche essere vittima dell'iniezione di codice. Se qualcuno aggiunge elementi non validi alla variabile, verrà eseguita come parte del awk
codice.
Funziona estraendo la variabile all'interno del codice, quindi diventa parte di essa.
Se si desidera apportare awk
modifiche che cambiano in modo dinamico con l'uso di variabili, è possibile farlo in questo modo, ma NON utilizzarlo per variabili normali.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Ecco un esempio di iniezione di codice:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
È possibile aggiungere molti comandi in awk
questo modo. Perfino farlo andare in crash con comandi non validi.
Informazioni extra:
Uso della doppia citazione
È sempre bene raddoppiare la variabile tra virgolette. In "$variable"
caso contrario, verranno aggiunte più righe come un'unica riga lunga.
Esempio:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Altri errori che puoi ottenere senza virgolette doppie:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
E con virgoletta singola, non espande il valore della variabile:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Ulteriori informazioni su AWK e variabili
Leggi questa domanda .