Согласно руководству по awk, BEGIN и END используются не для согласования ввода, а для предоставления информации о запуске и очистке скрипта awk. Вот приведенный пример:
ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf
Сначала это печатает строку для вывода. Затем он проверяет ввод на совпадение с образцом, где ввод начинается с символа или, за которым следует любой символ, один или много раз, за которым следует .conf. Для любых совпадений печатается 9-й столбец.
То, что мы вынуждены использовать, начинается здесь, означает ли это, что awk может использовать не более одной функции печати, содержащей BEGIN или END? Если нет, то почему мы не можем просто использовать функцию печати в начале без ключевого слова BEGIN? Кажется, НАЧАТЬ излишне.
Ответы:
Это
BEGIN
не лишнее. Если вы не укажете,BEGIN
тоprint
будет выполняться для каждой строки ввода.Цитирование из руководства :
источник
awk
обрабатывает каждую строку ввода для выражений, заданных в теле, кромеBEGIN
иEND
блоков. В случаеBEGIN
иEND
блоков,awk
будет обрабатывать заявления только один раз, прежде чем обработка ввода начала и после обработки ввода была сделана соответственно. БезBEGIN
блока не только вы не сможете печатать разовую информацию, такую как заголовки, вы не сможете эффективно инициализировать некоторые переменные, необходимые для тела. Кроме того , FYI,awk
программа может иметь несколькоBEGIN
иEND
блоки.источник
awk
выполняет каждый блок только тогда, когда шаблон перед ним совпадает. Пустой шаблон (просто блок) соответствует каждой строке.BEGIN
иEND
являются специальными шаблонами, которые соответствуют началу и концу файла (аналогично значению^
и$
в горизонтальном направлении).Если вы хотите что-то выполнить перед чтением файла, используйте
BEGIN
. Например, инициализация счетчиков или что-то.END
мог тогда собрать результаты.источник
В приведенном примере, который я считаю упрощенным для педагогической ясности, вы правы в том, что он излишний. Вы можете получить те же результаты, не используя
BEGIN
.выдаст те же результаты, поскольку оператор print ограничен только первой строкой ввода.
Это , как говорится,
BEGIN
иEND
блоки невероятно мощные инструменты. Как уже упоминалось в других решениях, вы можете использоватьBEGIN
блок для инициализации переменных или других подпрограмм, которые необходимо выполнить только один раз, но его также можно использовать для запуска команд Awk, когда нет файлов для обработки. Простой пример:Вы можете увидеть более серьезный пример программирования на Awk без какой-либо обработки здесь .
Аналогично,
END
блок чрезвычайно полезен для выполнения вычислений и суммирования всех входных данных. Это не может быть сделано (обычно) без предварительного чтения всех данных. Простой пример подведения итогов можно найти здесьисточник