Intereting Posts
Смущает эта команда `find` в скрипте Bash? amd64 или i386? VirtualBox не может запустить клиентскую виртуальную машину Мой IP-адрес занесен в черный список для отправки спама, журналы не показывают ничего Извлечение определенного файла из архива с использованием 7-Zip Каков надежный способ автоматизации загрузки FTP «новейшего файла в каталоге X»? Узнайте, какая команда запущена в сеансе экрана Как я могу увидеть весь файл, а также дождаться добавления большего количества данных в этот файл? Как я могу отправить поддельные пакеты в Linux? Создание QuickFIX на Arch-ARM Измените несколько файлов в разных папках одной командой? Поддерживать 100 экземпляров программы Как предотвратить использование оболочки звонящего в sudo Проблема с настройкой iptables (заблокирован трафик LDAP) Почему мой жесткий диск выходит из космоса, если gparted говорит, что у меня есть 500 + GB Отложенный процесс задания «Остановлен» все еще отображается в рабочей таблице

Использование переменной с awk -v в сценарии оболочки

Я изменяю / переписываю некоторые сценарии, написанные бывшими сотрудниками моей компании, и в одном из сценариев оболочки я нашел следующую строку.

b=`benchmark=30;grep "Waiting for timer" wk.txt | awk -vbenchmark=$benchmark '$6 > benchmark' | wc -l` 

Но, к сожалению, я не мог понять, что делает эта линия. Я смущен насчет использования переменной «benchmark». Я создал фиктивный файл «wk.txt» со следующими значениями, а при повторном вызове переменная $ b получила значение 1 (это всего лишь количество строк вывода команды grep + awk.

 [sreeraj@server ~]$ cat wk.txt 24 here above the Waiting for timer 37 make sure 

Может ли кто-нибудь объяснить, что автор сценария пытается использовать с эталоном $?

Страница awk man говорит ниже для -v , но я не понимаю, что она делает.

 -v var=val --assign var=val Assign the value val to the variable var, before execution of the program begins. Such variable values are available to the BEGIN block of an AWK program. 

Если вы это сделаете:

 awk -v benchmark=30 '...' 

Это то же самое, что:

 awk 'BEGIN{ benchmark = 30 } ... ' 

Это используется для установки начального значения для этой переменной.

Хотя я не понимаю, почему автор делает:

 benchmark=30; ... | awk -v benchmark=$benchmark .. 

Они могли бы также сделать:

 ... | awk -v benchmark=30 .. 

Путаница может быть вызвана тем фактом, что исходный автор использовал одно и то же имя переменной для оболочки:

 benchmark=30;gr... 

как он / она сделал внутри awk :

 awk -vbenchmark=$benchmark 

который может или не может присвоить значение benchmark значения переменной оболочки для benchmark производительности awk .

Если awk имеет это значение (в этом случае 30 ), awk проверяет, что 6-й столбец вашего входного файла wk.txt больше этого значения:

 $6 > benchmark 

Таким образом, тест, используя ваш пример, представляет собой сравнение строк:

 for > 30 

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

Это оценивается как true, поэтому awk печатает всю строку на wc -l которая подсчитывает количество строк. Поскольку у вас есть только одна строка в вашем входном файле, количество строк, где 6-й столбец больше, чем 30, равно 1 .

Это значение присваивается переменной оболочки b .