J’ai une variable suivante définie dans mon environnement Unix. Si j’essaie de l’utiliser dans la commande awk, cela ne fonctionne pas mais la même commande fonctionne quand je n’utilise pas la variable $ b
$ b = “NOUVEAU”
quand j’essaie la commande suivante, il ne fonctionne pas
echo "$a" | tr [az] [AZ] |awk -v RS=, '/TABLE/&&/CREATE/&&/`echo ${b}`/{print $NF}'
Mais, si je remplace la valeur $ b par NEW comme ci-dessous
echo "$a" | tr [az] [AZ] |awk -v RS=, '/TABLE/&&/CREATE/&&/NEW/{print $NF}'
Vous ne pouvez pas utiliser une bash
var dans awk
comme ça. Au lieu de cela, utilisez:
echo "$a" | tr [az] [AZ] | awk -v RS=, -v myvar=$b '/TABLE/&&/CREATE/&& $0~myvar {print $NF}'
Voir un exemple:
$ var="hello" $ awk -v text=$var 'BEGIN{print text}' hello
De plus, pour moi, cela fonctionne avec tr 'az' 'A-Z'
au lieu de tr [az] [AZ]
. Et sur la base de la suggestion de Mark Setchell , vous pouvez l’ignorer en utilisant IGNORECASE = 1
:
echo "$a" | awk -v RS=, -v myvar=$b 'BEGIN{IGNORECASE=1} /TABLE/&&/CREATE/&& $0~myvar {print $NF}'
Concernant votre question:
if i replace the $b value to NEW as below its working
Cela fonctionne parce que la valeur de votre variable est NEW
et que vous finissez par l’utiliser dans le regex
, ce qui est exactement ce que vous devez faire.
à propos de votre deuxième question:
can not use unix $variable in awk command
Vous ne pouvez pas utiliser de variables shell
dans awk
comme ça. Vous devez créer une variable awk
en utilisant l’option -v
et en atsortingbuant votre variable bash
.
awk -v awkvar="$bashvar" '/ /{ ... }'
Cela rend votre syntaxe existante comme:
echo "$a" | tr [az] [AZ] | awk -v RS=, -v var="$b" '/TABLE/&&/CREATE/&&/var/{print $NF}'
Cela ne fonctionnera pas, car les variables / / / ne sont pas interpolées, ce qui signifie qu’elles sont considérées littéralement. Donc, vous devez faire:
echo "$a" | tr [az] [AZ] |awk -v RS=, -v var="$b" '/TABLE/&&/CREATE/&&$0~var{print $NF}'