Comment puis-je utiliser le shell variables dans un script awk?
J'ai trouvé quelques façons de passer externe de la coquille des variables à un awk
script, mais je suis confus au sujet de '
et "
.
Tout d'abord, j'ai essayé avec un script shell:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Ensuite essayé awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Pourquoi est la différence?
Enfin j'ai essayé ceci:
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
Je suis confus au sujet de ce.
- J'aime l'-v comme indiqué ci-dessous, mais c'est vraiment un excellent exercice de réflexion sur la façon de protéger les choses à partir du shell. De travail par le biais de ma première coupe, utilisez des barres obliques inverses sur des espaces et des signes dollar. Inutile de dire que les exemples ici sont bien la peine de mon temps.
- Connexes: la Différence entre les guillemets simples et doubles dans awk.
Vous devez vous connecter pour publier un commentaire.
Obtenir des variables shell dans
awk
peut être fait de plusieurs façons. Certains sont meilleurs que d'autres. Cela devrait couvrir la plupart d'entre eux. Si vous avez des commentaires, veuillez nous laisser ci-dessous.
À l'aide de
-v
(Le meilleur moyen, le plus portable)Utiliser le
-v
option: (P. S. utilisez un espace après-v
ou il sera moins portable. E. g.,awk -v var=
pasawk -vvar=
)Cela devrait être compatible avec la plupart des
awk
, et la variable est disponible dans leBEGIN
bloc ainsi:Si vous disposez de plusieurs variables:
Avertissement. Ed Morton écrit, les séquences d'échappement sera interprétée de manière
\t
devient un véritabletab
et pas\t
si c'est ce que vous recherchez. Peut être résolu en utilisantENVIRON[]
ou d'y accéder viaARGV[]
Variable après le bloc de code
Ici nous obtenons la variable après le
awk
code. Cela fonctionne très bien tant que vous n'avez pas besoin de la variable dans leBEGIN
bloc:Cela fonctionne aussi avec de multiples variables
awk '{print a,b,$0}' a="$var1" b="$var2" file
À l'aide de la variable de cette manière ne fonctionne pas dans
BEGIN
bloc:Chaîne ici
Variable peut également être ajouté à
awk
à l'aide d'un chaîne ici à partir de coquilles qui les soutiennent (Bash):C'est la même chose que:
P. S. cette traite la variable en tant que fichier d'entrée.
ENVIRON
entréeComme TrueY écrit, vous pouvez utiliser le
ENVIRON
pour imprimer Variables d'Environnement.Définition d'une variable avant de l'exécuter AWK, vous pouvez l'imprimer comme ceci:
ARGV
entréeComme Steven Penny écrit, vous pouvez utiliser
ARGV
obtenir les données dans awk:Pour obtenir les données dans le code lui-même, pas juste de la COMMENCER:
Variable dans le code: à UTILISER AVEC PRUDENCE
Vous pouvez utiliser une variable dans le
awk
code, mais c'est salissant et difficile à lire, et commeCharles Duffy
points à l'extérieur, cette version peut également être une victime de l'injection de code. Si quelqu'un ajoute des choses mauvaises pour la variable, il sera exécuté dans le cadre de laawk
code.Cela fonctionne par extraction de la variable dans le code, de sorte qu'il devient une partie de lui.
Si vous voulez faire un
awk
qui change de façon dynamique avec l'utilisation de variables, vous pouvez le faire de cette façon, mais NE PAS utiliser pour des variables normales.Voici un exemple de l'injection de code:
Vous pouvez ajouter beaucoup de commandes à
awk
de cette façon. Même faire planter avec les commandes valides.Infos supplémentaires:
Utilisation de la double citation
Il est toujours bon de devis double variable
"$variable"
Si non, plusieurs lignes seront ajoutées comme une seule longue ligne.
Exemple:
D'autres erreurs que vous pouvez obtenir sans double citation:
Et avec une seule citation, il ne développe pas la valeur de la variable:
Plus d'infos sur AWK et les variables
Lisez cette faq.
Il semble que le bon vieux
ENVIRON
awk générateur de hachage n'est pas mentionné du tout. Un exemple de son utilisation:-v
ne fonctionne pas lorsque la valeur contient des barres obliques inverses.awk -v x='\c\d' ...
alors il sera utilisé correctement. Mais quandx
est imprimé awk les gouttes de la célèbre:awk: warning: escape sequence '\c' treated as plain 'c'
message d'erreur... Merci!Utiliser l'un ou l'autre selon la façon dont vous voulez les barres obliques inverses dans le shell variables manipulées (
avar
est une variable awk,svar
est une variable du shell):Voir http://cfajohnson.com/shell/cus-faq-2.html#Q24 pour plus de détails et d'autres options. La première méthode ci-dessus est presque toujours votre meilleure option et a le plus évident de la sémantique.
Vous pouvez passer dans le option de ligne de commande
-v
avec un nom de variable (v
) et une valeur (=
) de la variable d'environnement ("${v}"
):Ou pour le rendre plus clair (avec beaucoup moins de
v
s):Vous pouvez utiliser ARGV:
Notez que si vous allez continuer dans le corps, vous aurez besoin d'ajuster
ARGC:
J'ai eu pour insérer la date du début des lignes d'un fichier journal et c'est fait comme ci-dessous:
Il peut être rediriger vers un autre fichier pour enregistrer
J'ai juste changé @Jotne réponse à "boucle".