Awk nie działa w przypadku podwójnych cudzysłowów

11

To polecenie nie działa:

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

Powyżej ignoruje polecenie awk. Myślę, że może to być spowodowane podwójnymi cytatami?

Ponadto, jak dodać kolejny zestaw podwójnych cudzysłowów w awk?

to znaczy:

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

Próbowałem uciec od cytatów, próbowałem nawet tego:

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

bezskutecznie.

Nacięcie
źródło

Odpowiedzi:

19

Zmienna interpolacja jest wykonywana w podwójnych cudzysłowach, więc oto, co myślę, że może się dziać: po wpisaniu ssh $HOST "ls -l | awk '{print $1}'"twoja powłoka (ta na komputerze lokalnym, na którym działa klient SSH) rozpoznaje $1podwójne cudzysłowy i zamienia je na wartość zmiennej $1, która będzie pusta. Nie jest w stanie wykryć, że $1jest on zagnieżdżony w pojedynczych cudzysłowach w podwójnych cudzysłowach. Więc co kończy się wysyłaniem na zdalny serwer to

ls -l | awk '{print }'

co jest w zasadzie równoważne z

ls -l | cat

tzn. po prostu drukuje dane wyjściowe ls -l.

Rozwiązanie: uciec $z ukośnikiem odwrotnym,

ssh $HOST "ls -l | awk '{print \$1}'"
David Z
źródło
Haha, to było takie proste! Właśnie przejrzałem to! To zrobiło dokładnie to, co chciałem. ssh $ HOST "ls -l | awk '{print \ $ 1 \" * \ "}" "Wielkie dzięki!
Nick