НАЧНИТЕ и ЗАКОНЧИТЕСЬ командой awk

У Вас есть другие правила в Вашем sudoers файл, случайно? Правила применяются в порядке, поэтому если у Вас есть правило, разрешающее Вам выполнять команду с подсказкой пароля, сопровождаемой другим правилом, которое позволяет Вам выполнять команду без подсказки пароля, необходимо будет ввести пароль. Поместите правило без паролей сначала.

Посмотрите, Почему sudo говорит мне, что мой пароль является неправильным?

12
16.03.2014, 06:41
4 ответа

Указание BEGIN не является лишним. Если не указать BEGIN, то для каждой строки ввода будет выполняться print.

Цитата из руководства:

Правило BEGIN выполняется только один раз, до того, как будет прочитана первая входная запись. прочитана. Аналогично, правило END выполняется только один раз, после считывания всех входных данных. прочитаны.

$ seq 5 | awk 'BEGIN{print "Hello"}/4/{print}'   # Hello printed once
Hello
4
$ seq 5 | awk '{print "Hello"}/4/{print}'        # Hello printed for each line of input
Hello
Hello
Hello
Hello
4
Hello
$
10
27.01.2020, 19:55

awk[11790] выполняет каждый блок только тогда, когда шаблон до него совпадает. Пустой шаблон (просто блок) совпадает с каждой строкой. [11791]BEGIN[11792] и [11793]END[11794] - это специальные шаблоны, которые соответствуют началу и концу файла (аналогично значениям [11795]^[11796] и [11797]$[11798] в горизонтальном направлении).

Если вы хотите, чтобы что-то выполнялось до чтения файла, используйте [11799]BEGIN[11800]. Например, инициализация счетчиков или что-то в этом роде. [11801]END[11802] может затем собрать результаты.

.

2
27.01.2020, 19:55

awk обрабатывает каждую строку ввода для выражений, заданных в теле, кроме блоков BEGIN и END. В случае блоков BEGIN и END, awk обработает утверждения только один раз, до начала обработки ввода и после завершения обработки ввода соответственно. Без блока BEGIN вы не только не сможете печатать одноразовую информацию, такую как заголовки, но и не сможете эффективно инициализировать некоторые переменные, необходимые телу. Также, к вашему сведению, программа awk может иметь несколько блоков BEGIN и END.

7
27.01.2020, 19:55

В приведенном примере, который, как мне кажется, упрощен для педагогической ясности, вы правы, что он лишний. Вы могли бы получить те же самые результаты без использования [11696]BEGIN[11697].[12182] дал бы те же результаты, так как утверждение печати ограничено только первой строкой ввода.[12183] При этом блоки [11698]BEGIN[11699] и [11700]END[11701] являются невероятно мощными инструментами. Как упоминалось в других решениях, вы можете использовать блок [11702]BEGIN[11703] для инициализации переменных или других процедур, которые нужно выполнить только один раз, но он также может быть использован для выполнения команд Awk, когда нет файлов для обработки. Простой пример:[12184]Вы можете увидеть [11704]более серьезный пример программирования в Awk без обработки каких-либо входных данных здесь[11705].[12185]Аналогично, блок [11706]END[11707] чрезвычайно полезен для выполнения вычислений и суммирования всех входных данных. Это невозможно (обычно) сделать без первого прочтения всех данных. [11708] Простой пример суммирования входных данных можно найти здесь [12186]
0
27.01.2020, 19:55

Теги

Похожие вопросы