Comment faire fonctionner les variables bash sur awk pipe

Je ne peux pas obtenir de variable à partir de mon script bash pour travailler sur les canalisations awk.

SERVER_PORT="27018" ... HOLDER=`netstat -tlpn | awk -v sp=$SERVER_PORT '/:sp */ {split($NF,a,"/"); print a[1]}'` 

Après l’exécution de la commande pour cette variable, l’équation suivante est TRUE!

 ... if [ "$HOLDER" == "" ]; then ... 

Si je cours

 netstat -tlpn | awk '/:27018 */ {split($NF,a,"/"); print a[1]}' 

sur ma fenêtre shell tout va bien et ça me donne le PID du processus.

Donc, ma question est la suivante: comment passer des variables à awk correctement ou si quelque chose est cassé? Exécution de CentOS 7

Dans une expression régulière, la constante awk ne développe pas les variables. Donc /:sp */ est littéralement /:sp */ .

Vous devez faire correspondre une chaîne: $0 ~ ":"sp" *"

Les scripts awk sont composés de paires de pattern {action} . /:27018 */ est un pattern (utilisant une constante regexp). Comme je l’ai dit au début, awk ne développe pas les variables dans une constante d’expression rationnelle, donc /:sp */ correspond à ces caractères littéraux.

Il existe d’autres modèles possibles au-delà d’une constante d’expressions rationnelles. Même les chaînes statiques peuvent être des modèles (elles sont toujours vraies mais elles fonctionnent).

~ est un opérateur de correspondance d’expression régulière dans awk. Vous pouvez l’utiliser pour effectuer manuellement le même type de correspondance que le modèle constant regexp. ~ prend deux arguments de chaîne.

En mettant cela ensemble, nous pouvons faire correspondre ( ~ ) la ligne entière ( $0 ) à une expression régulière de constante de chaîne (plutôt qu’une constante d’expression régulière) de ":"sp" *" (la chaîne ":" , notre variable sp et la chaîne " *" ).

Ce qui, une fois assemblé, vous donne (comme je l’ai écrit ci-dessus) $0 ~ ":"sp" *" comme motif au lieu de la constante regexp.