J’essaie d’accéder à une variable shell à l’intérieur d’un nawk canalisé. Je ne l’ai jamais fait auparavant et je me demandais si c’était possible.
Voici la commande sbdadm list-lu
contents:
Trouvé 2 LU (s)
GUID DATA SIZE SOURCE
600144f029bf0a0000004e0484740052 107380964864 / dev / rdsk / c9d0s1 600144f029bf0a0000004e0484740053 53694562304 / dev / rdsk / c9d0s3
- utiliser les commandes unix pour filtrer et sortinger les données
- Triez le numéro dans une chaîne de texte
- Joindre des fichiers basés sur deux colonnes en utilisant awk
- Comment lire les lignes et les colonnes via awk avec un séparateur de caractères spécial
- Supprimer la ligne en double basée sur la colonne pour le fichier de longueur fixe
Voici mon exemple de mon script:
DISK=/dev/rdsk/c9d0s3 sbdadm list-lu |nawk '/$DISK/ {print}'
NOTE : Je sais que la syntaxe ” /$DISK/
” ne fonctionnera pas car $ fait partie d’un symbole regex. J’ai besoin de la bonne syntaxe si un tel code est possible.
En outre, awk génère-t-il un autre shell? Si oui, est-il possible que je puisse exporter cette variable $DISK
vers ce shell.
Le problème n’est pas que $
fait partie de la syntaxe RE; c’est que /
est le délimiteur RE. Si vous cherchiez juste c9d0s3
, alors utiliser le bon quotient ferait l’affaire:
$ DISK=c9d0s3 $ awk "/$DISK/ {print}" output 600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3
Explication: si vous utilisez ""
au lieu de ''
, la variable shell sera développée avant de transférer le programme à awk
, donc awk
verra
/c9d0s3/ {print}
comme son programme. Vous pouvez toujours rechercher un motif avec /
dans celui-ci, mais il faut un peu de magie pour citer le shell:
$ DISK=/dev/rdsk/c9d0s3 $ awk "{if (match(\$0, \"$DISK\")) print}" output 600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3
Et non, awk
ne crée pas de sous-couche. Pourquoi serait-ce? Et pourquoi auriez-vous besoin d’une personne pour passer une variable si vous pouvez le faire simplement dans l’environnement?
export DISK=/dev/rdsk/c9d0s3 cat output | awk '$0 ~ ENVIRON["DISK"]{print}'
résultats:
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3
Avec appel system
(après l’exportation du disque):
echo | awk '{system("echo $DISK")}'
résultats:
/dev/rdsk/c9d0s3
En plus de la réponse de jwr , vous pouvez définir explicitement une variable awk avec la valeur de la variable shell:
nawk -v disk="$DISK" '$3 == disk' output_file