Obtention de variables shell dans awk
peut se faire de plusieurs manières. Certains sont meilleurs que d'autres. Cela devrait couvrir la plupart d'entre eux. Si vous avez un commentaire, veuillez laisser ci-dessous. v1.5
Utilisation -v (La meilleure façon, la plus portable)
Utilisez l' -voption: (PS utilisez un espace après -vou ce sera moins portable. Par exemple, awk -v var=pas awk -vvar=)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Cela devrait être compatible avec la plupart awk, et la variable est également disponible dans le BEGINbloc:
Si vous avez plusieurs variables:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Attention . Comme l'écrit Ed Morton, les séquences d'échappement seront interprétées et \tdeviennent donc un réel tabet non \tsi c'est ce que vous recherchez. Peut être résolu en l'utilisant ENVIRON[]ou en y accédant viaARGV[]
PS Si vous aimez trois barres verticales comme séparateur |||, il ne peut pas être échappé, alors utilisez-F"[|][|][|]"
Exemple sur l'obtention de données à partir d'un programme / fonction auberge awk(ici la date est utilisée)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Variable après bloc de code
Ici, nous obtenons la variable après le awkcode. Cela fonctionnera bien tant que vous n'avez pas besoin de la variable dans le BEGINbloc:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Ajout de plusieurs variables:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- De cette façon, nous pouvons également définir un séparateur de champs différent
FSpour chaque fichier.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Variable après le bloc de code ne fonctionnera pas pour le
BEGINbloc:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Here-string
Une variable peut également être ajoutée à l' awkutilisation d'une chaîne ici à partir de shells qui les prennent en charge (y compris Bash):
awk '{print $0}' <<< "$variable"
test
C'est la même chose que:
printf '%s' "$variable" | awk '{print $0}'
PS cela traite la variable comme une entrée de fichier.
ENVIRON contribution
Comme TrueY l'écrit, vous pouvez utiliser ENVIRONpour imprimer les variables d'environnement . En définissant une variable avant d'exécuter AWK, vous pouvez l'imprimer comme ceci:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV contribution
Comme l'écrit Steven Penny, vous pouvez utiliser ARGVpour obtenir les données dans awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Pour obtenir les données dans le code lui-même, pas seulement le début:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Variable dans le code: UTILISER AVEC ATTENTION
Vous pouvez utiliser une variable dans le awkcode, mais c'est compliqué et difficile à lire, et comme le Charles Duffysouligne, cette version peut également être victime d'une injection de code. Si quelqu'un ajoute de mauvaises choses à la variable, elle sera exécutée dans le cadre du awkcode.
Cela fonctionne en extrayant la variable dans le code, elle en fait donc partie.
Si vous voulez faire un awkqui change dynamiquement avec l'utilisation de variables, vous pouvez le faire de cette façon, mais NE l'utilisez PAS pour des variables normales.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Voici un exemple d'injection de code:
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
Vous pouvez ajouter de nombreuses commandes de awkcette façon. Même le faire planter avec des commandes non valides.
Informaitons supplémentaires:
Utilisation de guillemets doubles
Il est toujours bon de doubler la variable de citation. "$variable"
Sinon, plusieurs lignes seront ajoutées sous la forme d'une longue ligne unique.
Exemple:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Autres erreurs que vous pouvez obtenir sans guillemet double:
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
Et avec un guillemet simple, il n'augmente pas la valeur de la variable:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Plus d'informations sur AWK et les variables
Lisez cette FAQ .