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' -v
option: (PS utilisez un espace après -v
ou 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 BEGIN
bloc:
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 \t
deviennent donc un réel tab
et non \t
si 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 awk
code. Cela fonctionnera bien tant que vous n'avez pas besoin de la variable dans le BEGIN
bloc:
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
FS
pour chaque fichier.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Variable après le bloc de code ne fonctionnera pas pour le
BEGIN
bloc:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Here-string
Une variable peut également être ajoutée à l' awk
utilisation 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 ENVIRON
pour 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 ARGV
pour 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 awk
code, mais c'est compliqué et difficile à lire, et comme le Charles Duffy
souligne, 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 awk
code.
Cela fonctionne en extrayant la variable dans le code, elle en fait donc partie.
Si vous voulez faire un awk
qui 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 awk
cette 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 .