Так... формат awk
программа является серией EXPRESSION { ACTION }
операторы. Если Вы опускаете ACTION
часть, это принимает print
, и если Вы опускаете EXPRESSION
, это соответствует всему. Таким образом, это печатает все:
awk 1
Поскольку Ваше выражение (1
) оценивает как "верный" (и у Вас нет действия). Это верно для всех Ваших "x-does-print" примеров, так как дали Ваш демонстрационный вход, у них всех есть ненулевое и непустое EXPRESSION
и нет ACTION
. Учитывая пустую входную строку, $0
во втором примере ничего не произвел бы.
Аналогично, Ваши примеры "ничего-печати" кроме первого имеют выражение, которое оценивает ко "лжи" (или пустая строка или числовой 0). {$0="abc"}
пример работает по-другому: это ничего не печатает, потому что это не имеет никакой инструкции по печати. Учитывая длинную входную строку по крайней мере с 999 полями, второй пример ($999
) на самом деле распечатал бы строку.
Это фундаментально для как awk
работает. Настолько уверенный, это документируется, и это не собирается повреждаться.
Обратите внимание, что Ваши примеры "катастрофических отказов" на самом деле не отказывают; Вы только что сделали основную ошибку в своем синтаксисе оболочки. Awk интерпретирует аргументы, запускающиеся с -
как параметры командной строки. Заключение в кавычки их ничего не изменяет. Если Вы хотите передать awk отрицательные числа как это, необходимо снабдить префиксом awk программу --
чтобы указать к awk, что это должно прекратить обрабатывать опции:
echo 'crashes' | awk -- -3.14159
Распечатает "катастрофические отказы", с тех пор -3.14150
ни пустая строка, ни числовой 0.
Посмотрите этот файл для своего ядра (вероятно, большинство даже не переключило главные версии ядра):