awk: принуждение статуса возврата?

Из руководства:

Иногда процесс args будет недоступен; когда это происходит, ps вместо этого распечатает исполняемое имя в скобках.

17
13.04.2017, 15:36
3 ответа

Сохраните состояние в переменной и используйте его в END блок.

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd
23
27.01.2020, 19:47
  • 1
    Очень хороший. Однако я сталкиваюсь с проблемами, включающими это в сценарий удара. Я пытаюсь получить статус возврата этого awk оператора путем добавления чего-то как ; echo $? после этого awk оператора. Однако echo $? никогда не выполняется потому что END {exit err}' завершает сценарий. Существует ли способ установить статус возврата без выхода? –  Stefan Lasiewski 13.07.2011, 20:38
  • 2
    @StefanLasiewski exit err завершает awk, он не завершает сценарий. Вы имеете set -e в том сценарии, случайно? Если так, Вы сказали оболочке выходить, если команда возвращает ненулевое состояние; если Вы хотите протестировать состояние, использовать if awk …; then echo ok; else echo fail; fi. –  Gilles 'SO- stop being evil' 14.07.2011, 01:50
  • 3
    @Giles: Да, этот сценарий действительно имеет set -e набор. Это объясняет странное поведение, которое я вижу. Спасибо за указание на это. –  Stefan Lasiewski 14.07.2011, 02:21

Я искал что-то похожее на GREP, где он выйдет 1, если матч не найден. Вот эквивалент с awk:

awk '
BEGIN   {z=1}
/bravo/ {z=0; print}
END     {exit z}
' alpha.txt

Пример

7
27.01.2020, 19:47

Это не соответствует точным требованиям OP, но если вы только заботитесь о коде возврата, и вам не нужно печатать совпадающие строки, аналогично grep -q, затем вы можете изменить ответ @geekasur, чтобы выйти после первого совпадения, что для огромных входных файлов сэкономит время, если ошибка находится в начале файла. Надеюсь, /etc/passwdвам не подходит!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd
0
27.01.2020, 19:47

Теги

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