accéder aux variables externes du shell dans nawk dans ksh

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

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