Awk ne fonctionne pas entre guillemets

11

Cette commande ne fonctionne pas:

ssh $HOST "ls -l | awk '{print $1}'"`

Ci-dessus ignore la commande awk. Je pense que cela pourrait être à cause des guillemets doubles?

Aussi, comment pourrais-je ajouter un autre ensemble de guillemets doubles à l'intérieur du awk?

c'est à dire:

ssh $HOST "awk '{print $1 "*"}' /some_file"

J'ai essayé d'échapper aux citations, j'ai même essayé ceci:

ssh $HOST "awk '{print $1 "\""*"\""}' /some_file"

sans succès.

Entaille
la source

Réponses:

19

L’interpolation des variables est effectuée entre guillemets, alors voici ce que je pense qui pourrait se produire: lorsque vous tapez ssh $HOST "ls -l | awk '{print $1}'", votre shell (celui de votre ordinateur local, sur lequel vous exécutez le client SSH) voit $1à l’intérieur des guillemets et le remplace par le valeur de la variable $1, qui sera vide. Il n'est pas en mesure de détecter que le $1est imbriqué entre guillemets simples dans les guillemets doubles. Donc, ce qui finit par être envoyé au serveur distant est

ls -l | awk '{print }'

qui est fondamentalement équivalent à

ls -l | cat

c'est-à-dire qu'il ne fait qu'imprimer le résultat de ls -l.

Solution: échapper à la $barre oblique inversée,

ssh $HOST "ls -l | awk '{print \$1}'"
David Z
la source
Haha, c'était si simple! Je viens de regarder à travers elle! Cela a fait exactement ce que je voulais. ssh $ HOST "ls -l | awk '{print \ $ 1 \" * ""' "Merci beaucoup!
Nick