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
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}'
# ^^^^^ ^^^^^
# |________________________________|
$ a=3
$ awk -v myvar="$a" 'BEGIN{print myvar}'
3
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.
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.