2013-12-21 5 views
1

Могу ли я создать переменную awk в одном лайнере, используя методы замены bash? Вот что я пытаюсь, но что-то не так.Выполняет ли awk -v замену команды?

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if (AVG >= 1) print "there is a load" }' 

Возможно, это потому, что в подстановке команд используется Awk (хотя я сомневаюсь)? Может быть, это тоже «Inception-ish»? GNU Awk 3.1.7

ответ

1

Там нет ничего плохого в вашей команде. Ваша команда ждет ввода, и это единственная причина, по которой она не выполняется!

Например:

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if (AVG >= 0) print "there is a load" }' 
abc     ## I typed. 
there is a load  ## Output. 

Просто включите НАЧАТЬ в вашей команде, как полагают эксперты!

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if (AVG >= 0) print "there is a load" }' 
there is a load 
0

Поскольку последняя команда awk не имеет входного файла, вы можете использовать только условие BEGIN для этого скрипта. Таким образом, вы можете попробовать следующее:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if (AVG >= 1) print "there is a load" }' 
3

Зачем использовать переменную здесь вообще? До сих пор, как AWK читает stdin, если явно не указано обратное, что должно быть предпочтительным способом:

$ uptime | awk '$(NF-2) >= 1 { print "there is a load" }' 
there is a load 
+2

Вы можете исправить ошибку опечатку? В (NF-2) отсутствует $ -знак. Должно быть $ (NF-2). – alvits

+0

@ пользователь3088572, спасибо. Исправлена. Сожалею. –

+0

+1 Добро пожаловать. Теперь я могу голосовать. – alvits

0

Это:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if (AVG >= 1) print "there is a load" }' 

нуждается в НАЧАТЬ, как другие утверждали:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if (AVG >= 1) print "there is a load" }' 

, но и вам не нужно вызывать AWK в два раза, что можно записать в виде:

awk -v uptime=$(uptime) 'BEGIN{ n=split(uptime,u); AVG=u[n-2]; if (AVG >= 1) print "there is a load" }' 

или, скорее всего, что вы хотите:

uptime | awk '{ AVG=$(NF-2); if (AVG >= 1) print "there is a load" }' 

, которая может быть уменьшена до:

uptime | awk '$(NF-2) >= 1 { print "there is a load" }'