web-dev-qa-db-fra.com

Comment passer une variable de chaîne en tant que paramètre à awk

J'ai la commande suivante:

usb_soundcard_sink=$(pactl list short sinks | grep "alsa_output" | awk '{ print $2 }' | tail -n1)

le résultat de cette commande est:

alsa_output.pci-0000_00_1b.0.analog-stereo

Et voici une autre commande qui trouve le numéro d'index:

var=$(pactl list short sinks | awk '$2=="alsa_output.pci-0000_00_1b.0.analog-stereo" {print $1}')

sortie:

0

Mais je veux passer la variable "usb_soundcard_sink" à la place de la valeur codée en dur, à savoir "alsa_output.pci-0000_00_1b.0.analog-stereo" dans la commande ci-dessus. La valeur b'coz de la variable "usb_soundcard_sink" peut changer de manière dynamique.

Aussi j'ai essayé le suivant:

var=$(pactl list short sinks | awk '$2=="$usb_soundcard_sink" {print $1}')

Mais ça ne fonctionne pas

alors comment puis-je transmettre la valeur de la variable "usb_soundcard_sink" à la commande ci-dessus

4
Prakash V Holkar

Pour utiliser les variables bash dans votre awk, vous devez utiliser la syntaxe -v comme ceci:

pactl list short sinks | awk -v myvar="$usb_soundcard_sink" '$2==myvar {print $1}'
#                               ^^^^^                            ^^^^^
#                                 |________________________________|

Exemple

$ a=3
$ awk -v myvar="$a" 'BEGIN{print myvar}'
3
17
fedorqui

J'ai trouvé que ça marche aussi

line=myfile.dat
f=8
s=11
echo $line | awk '{print $'$f',$'$s'}'

Ici, j’ai un fichier appelé myfile.dat qui passe dans awk et qui crache les colonnes 8 et 11.

4
User-Z

MAWK (version AWK par défaut d'Ubuntu) et GAWK lisent des arguments de ligne de commande autres que des options sous la forme identifier=value en tant qu'assignations de variables, qui sont exécutés juste après l'exécution des instructions BEGIN:

% echo | mawk -- '{print var}' var=foo 
foo
% echo | gawk -- '{print var}' var=foo
foo
% echo foo bar baz | mawk -- '{$1=$1}1' OFS=,
foo,bar,baz
% echo foo bar baz | gawk -- '{$1=$1}1' OFS=,
foo,bar,baz

Je préfère cette méthode à l'option -v car elle garde la commande plus propre, séparant clairement les options à transmettre à l'interpréteur et les détails du programme.

De man mawk:

Les arguments de ligne de commande se divisent en trois ensembles: arguments de fichier, arguments d’affectation et chaînes vides "". Une affectation a la forme var = chaîne. Lorsqu'un ARGV [i] est examiné en tant qu'argument de fichier possible, s'il est vide, il est ignoré. s'il s'agit d'un argument d'affectation, l'affectation à var a lieu et je passe à l'argument suivant; sinon ARGV [i] est ouvert pour la saisie.

De man gawk:

Si un nom de fichier sur la ligne de commande prend la forme var = val, il est traité comme une affectation de variable. La variable var se verra attribuer la valeur val. (Cela se produit une fois que toutes les règles BEGIN ont été exécutées.) L'affectation de variables de ligne de commande est particulièrement utile pour attribuer de manière dynamique des valeurs aux variables utilisées par AWK pour contrôler la manière dont les entrées sont fractionnées en champs et en enregistrements. C'est également utile pour contrôler l'état si plusieurs passes sont nécessaires sur un seul fichier de données.

0
kos