LINUX.ORG.RU

Кавычки в bash и awk

 


0

1

Подскажите, хочу в bash сформировать строку которая пойдет в awk

screen=$(who | awk '{print $5}')
решаю сделать подстановку текущего пользователя, вроде awk '/user/ {print $5}', застрял на простой подстановке awk=«'{print \$5}'» scree=$(who | $awk) из-за экранирование или еще чего такой фокус не проходит, хотя
echo $awk
выводит '{print $5}'

Как тут надо экранировать что бы прошло?


Хз, работает всё:

15:04:10 human@pc:~ 
→ bash --version
GNU bash, версия 4.4.19(1)-release (x86_64-pc-linux-gnu)
Все права защищены (C) 2016 Фонд свободного программного обеспечения.
Лицензия GPLv3+: GNU GPL версии 3 или более поздней <http://gnu.org/licenses/gpl.html>

Это свободное программное обеспечение. Вы можете изменять и распространять его.
НИКАКАЯ ГАРАНТИЯ не предоставляется в пределах, допускаемых законом.
15:04:21 human@pc:~ 
→ screen=$(who | awk '{print $5}')
15:04:24 human@pc:~ 
→ echo $screen
(:0)

и так тоже

screen=`who | awk '{print $5}'`

WoozyMasta
()

awk=«'{print \$5}'» scree=$(who | $awk)

Так вы в переменную awk что подставляете?

hanharr
()
Ответ на: комментарий от anonymous

Ок, спасибо, а как еще текущего пользователя в это дело подставить? что бы получить нечто вроде

cmd='/$user/ {print $5}'
т.е. мне нужна строка где и кавычки есть одинарные и подставнока прошла

da17
() автор топика
Ответ на: комментарий от da17

Попробуйте так, сначала напутал с кавычками.

:~$ awk='{print $5}'
:~$ screen=$(who | awk "$awk")
:~$ echo "$screen"
hanharr
()

решаю сделать подстановку текущего пользователя, вроде awk '/user/ {print $5}',

можно сделать разрыв в кавычках

screen=$(who | awk '/'$user'/ {print $5}')

или внести переменную в awk

screen=$(who | awk -v a=$user '/$a/ {print $5}')

anonymous
()
Ответ на: комментарий от anonymous

или внести переменную в awk
screen=$(who | awk -v a=$user '/$a/ {print $5}')

Не будет работать переменная в //, Ну да не важно, этот способ ужасный по другой причине — нельзя так делать в общем случае, когда в переменной может быть навороченный /regex/ для awk.

Правильный вариант:

screen=$(who | awk "/$user/ {print \$5}")

vodz ★★★★★
()

awk=«'{print \$5}'»

\ не нужен, внутри одинарных кавычек variable substitution не производится.

scree=$(who | $awk)

А где awk $awk?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

\ не нужен, внутри одинарных кавычек variable substitution не производится.

Что за глупости, одинарные кавычки там обычные символы внутри двойных.

vodz ★★★★★
()

Чем страдать с тремя слоями экранирования можно просто передать в авк переменную:

awk --assign "user=$bashuser" '$0 ~ user { print $5 }'

или даже так:

export bashuser
awk '$0 ~ ENVIRON["bashuser"] { print $5 }'

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Чем страдать с

Ну не знаю, мой способ всё же со скобками намного проще и явно портабельнее.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.