awk: примушування повернення статусу?


18

Це продовження мого попереднього питання .

Я перевіряю кількість полів у / etc / passwd за допомогою цього зручного snippit. У наступному прикладі користувачі 'fieldcount1' та 'fieldcount2' мають неправильну кількість полів:

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

Як ви помітите, awk вийде зі статусом повернення 0. З цієї точки зору, тут проблем немає.

Я хотів би включити цю заяву awk у сценарій оболонки. Я хотів би надрукувати всі рядки, які є помилкою, і встановити код повернення рівним 1 (помилка).

Я можу спробувати примусити певний статус виходу, але тоді awk друкує лише один рядок:

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

Чи можу я змусити awk вийти зі статусом повернення '1' та надрукувати всі рядки, які відповідають?

Відповіді:


23

Зберігайте статус у змінній та використовуйте його у ENDблоці.

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

Дуже добре. Однак у мене виникають проблеми з включенням цього в скрипт bash. Я намагаюся зафіксувати статус повернення цього оператора awk, додавши щось подібне ; echo $?після цього запиту awk. Однак echo $?ніколи не запускається, оскільки END {exit err}'припиняє сценарій. Чи є спосіб встановити статус повернення без виходу?
Стефан Ласєвський

6
@StefanLasiewski exit errприпиняє awk, сценарій не припиняється. Чи є set -eу вас цей сценарій випадково? Якщо так, ви сказали оболонці вийти, якщо команда повертає ненульовий статус; якщо ви хочете перевірити статус, використовуйте if awk …; then echo ok; else echo fail; fi.
Жил 'ТАК - перестань бути злим'

@Giles: Так, цей сценарій set -eвстановлений. Це пояснює дивну поведінку, яку я бачу. Дякуємо, що вказали на це.
Стефан Ласєвський

1
Якщо ви плануєте використовувати висновок з &&оператором bash , варто пам’ятати, що «0 - це правда, але false - 1 в оболонці» .
Skippy le Grand Gourou

8

Я шукав щось подібне до Грепа, де воно вийде 1, якщо відповідність не буде знайдена. Ось еквівалент Awk:

#!/usr/bin/awk -f
BEGIN {
   b1 = 1
}
index($0, "sunday") > 0 {
   b1 = 0
   print
}
END {
   exit b1
}

0

Це не відповідає точним вимогам до ОП, але якщо ви дбаєте лише про код повернення і не потребуєте друку рядків, що відповідають аналогічному grep -q, ви можете змінити відповідь @geekasaur для виходу після першого матчу, що для величезного вкладу Файли економлять час, якщо помилка виявиться на початку файлу. Сподіваємось /etc/passwd, не підходить до вас!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

1
awk -F: 'NF != 7 {exit 1}'зробимо те саме.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.