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' -vopzione: (PS usa uno spazio dopo -vo 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 awke la variabile è disponibile anche nel BEGINblocco:
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 \tdiventare reali tabe non \tse 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 awkcodice. Funzionerà perfettamente finché non avrai bisogno della variabile nel BEGINblocco:
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
FSper ogni file.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- La variabile dopo il blocco di codice non funzionerà per il
BEGINblocco:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Qui-string
La variabile può anche essere aggiunta awkall'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 ENVIRONper 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 ARGVper 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 awkcodice, ma è disordinata e difficile da leggere e, come Charles Duffysottolinea, questa versione potrebbe anche essere vittima dell'iniezione di codice. Se qualcuno aggiunge elementi non validi alla variabile, verrà eseguita come parte del awkcodice.
Funziona estraendo la variabile all'interno del codice, quindi diventa parte di essa.
Se si desidera apportare awkmodifiche 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 awkquesto 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 .