Shell - Utilisation de variable avec awk [Résolu/Fermé]

Signaler
-
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
-
Bonjour,



Je dois effectuer une recherche sur tous les processus fils d'un ID donné, et voir si un de ces fils est un processus Java (si il en existe un, il est unique). Voici mon script et mon problème:


script_awk ( ) 
{

VAR=$1

ps -Af | awk {'if ( $3 == $VAR )print $0'} | grep java >file

if [ -s file ]
then
        IDJAVA='cat file'
	javafile="yes"
	echo "proc java"
else
        echo "pas de fichier java"
fi

}


Je suis donc faire appel à ma fonction avec comme paramètre l'ID du proc "père", que je stock dans une variable VAR. Cependant, elle n'est pas reconnu lorsque je l'utilise dans awk avec $VAR.

2 réponses

Messages postés
29904
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 juin 2021
7 126
C'est normal, avec l'opérateur '...' le shell n'évalue pas les valeurs de variables (typiquement $VAR). Il faut les échapper. On sent bien en plus qu'il y a quelque chose à faire car $0, $1... n'ont pas la même signification en shelle et en awk.

Bref, il faut utiliser l'opérateur "..." et échapper (avec \) les opérateurs awk pour qu'ils ne soient pas interprétés en tant qu'opérateurs shell.

Voici par exemple un script shell qui liste les processus de root et qui apparaissent dans ps -Af :

#!/bin/sh 
VAR="root" 
ps -Af | awk "{if ( \$1 == \"$VAR\" ) print \$0}"


Pour éviter ce genre d'erreur, tu peux utiliser un éditeur texte qui propose de la coloration syntaxique (par exemple vim) et qui t'aidera à comprendre comment ta commande shell est évaluée.

Bonne chance
En effet, j'avais essayé l'opérateur "..." , mais sans échappant les bon "$".
Merci, ça marche !
Messages postés
29904
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 juin 2021
7 126
De rien, bonne continuation ;-)
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 308
hello
on peut aussi faire
ps -Af | awk -v  var=$VAR '/java/ && $3==var {print $0}'