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.