Почему awk печатает на непустых строках и положительных числах

Поддержки Apache несколько специальных отладок определяют, чтобы использоваться с-D:

  • NO_DETACH: не отсоединяйтесь от терминала управления.
  • ПЕРЕДНИЙ ПЛАН: (подразумевает NO_DETACH): не Делайте daemonize или отсоединения от терминала управления
  • ONE_PROCESS (подразумевает NO_DETACH и ПЕРЕДНИЙ ПЛАН): не позволяйте дочернему процессу обрабатывать клиентские запросы; используйте начальный процесс вместо этого.
  • ОТЛАДКА (подразумевает все предыдущие): Помещает MPM в специальный режим отладки с дополнительным входом.

Таким образом выполнение "httpd-D ПЕРЕДНИЙ ПЛАН" сохранит его от daemonizing.

Я также столкнулся с потоком форума с launchd plist для Apache2, который Вы смогли адаптировать.

(Примечание: Я знаю, что ни один из них не отвечает на фактический вопрос, но надо надеяться они полезны для проблемы, первоначально описанной.)

1
08.03.2012, 18:24
2 ответа

Так... формат 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.

7
27.01.2020, 23:12
  • 1
    Это действительно не рассматривает вопрос того, почему Вы сделали бы это с awk с тех пор awk 1 действительно просто более длинный способ ввести cat. –  larsks 08.03.2012, 18:23
  • 2
    , Вы объяснили это очень хорошо... Простые примеры похожи cat, но более "реалистический" пример больше похож на это: awk '{$0="abc"}1' ... Я первоначально думал, что это, должно быть, была истинная/ложная вещь, но когда отрицательные числа перестали работать, я полагал, что пришло время задать вопрос... Я не рассмотрел возможности -1 будучи аргументом, но я предполагаю, что это довольно очевидно задним числом :)... Спасибо... –  Peter.O 08.03.2012, 19:54
  • 3
    Большое объяснение, только одно исправление. awk '' пример больше похож awk 'BEGIN {}' чем он похож awk '0'. Первые два не используют stdin; третье будет. Попробовать echo test | { awk ''; echo done; cat; } –  dubiousjim 19.04.2012, 21:57

От GNU awk руководство:

Много языков программирования имеют специальное представление для понятия “истинных” и “ложных”. Такие языки обычно используют специальную истину и ложь констант или возможно их прописные эквиваленты. Однако awk отличается. Это одалживает очень простое понятие истины и лжи от C. В awk, любом ненулевом числовом значении или любом значении непустой строки верно. Любое другое значение (нуль или пустая строка, "") является ложью.

Да, то использование является портативным и будущим безопасным.

Заметка на полях, это показывает Ваш второй пример,

echo 'b-does-print-$0' | awk '$0'  

не распечатает каждую строку, только те, что awk интерпретирует как истинная строка, т.е. пустая строка или строка, содержащая только способ записать номер 0 (0, 00, 0.0e3, -.0, …).

1
27.01.2020, 23:12

Теги

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