Shell - Utilisation de variable avec awk

Résolu
gamerounet -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
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.
A voir également:

2 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
0
gamerounet
 
En effet, j'avais essayé l'opérateur "..." , mais sans échappant les bon "$".
Merci, ça marche !
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
De rien, bonne continuation ;-)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
on peut aussi faire
ps -Af | awk -v  var=$VAR '/java/ && $3==var {print $0}'
0