awk - проверить, была ли печать успешной - PullRequest
0 голосов
/ 26 октября 2018

Существует несколько причин, по которым оператор print в awk может не сработать: нет прав на запись в указанный файл, файл не существует, и awk не может его создать и т. Д. Как это возможно?проверить успешность оператора awk print?Я пробовал следующее:

$ cat printError.awk
BEGIN {
    if (! (print("Hello") > "/this/doesnt/exist")) {
        print "Could not print"
    }
}

Но это дает синтаксическую ошибку, я думаю, потому что печать это оператор, а не функция.

$ awk -f printError.awk 
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:         ^ syntax error
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:                                               ^ syntax error
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:                                                 ^ syntax error

РЕДАКТИРОВАТЬ: я нашел решениедля gawk 4.2+, но среда, в которой я работаю, имеет только 4.0, поэтому я все еще ищу решение для этой версии.

1 Ответ

0 голосов
/ 26 октября 2018

Для gawk 4.2 ответ здесь: https://www.gnu.org/software/gawk/manual/html_node/Nonfatal.html. Но кажется, что PROCINFO ["NONFATAL"] отсутствует в более ранних версиях.

5.10 Включение нефатального вывода

В этом разделе описывается специфическая для gawk функция.

В стандартном awk вывод с print или printf в несуществующий файл или какая-либо другая ошибка ввода-вывода (например, заполнение диска) являетсяфатальная ошибка.

$ gawk 'BEGIN {print "hi"> "/ no / such / file"}' error → gawk: cmd.строка: 1: fatal: невозможно перенаправить в `/ no / such / file '(нет ошибки → такой файл или каталог)

gawk позволяет обнаружить, что произошла ошибка, что позволяет вамвосстановиться после ошибки или, по крайней мере, распечатать сообщение об ошибке по вашему выбору перед выходом.Вы можете сделать это одним из двух способов:

For all output files, by assigning any value to PROCINFO["NONFATAL"].
On a per-file basis, by assigning any value to PROCINFO[filename, "NONFATAL"]. Here, filename is the name of the file to which you wish

вывод быть нефатальным.

После того, как вы включили нефатальный вывод, вы должны проверять ERRNO после каждого соответствующего оператора print или printf, чтобы убедиться, что что-то пошло не так.Также рекомендуется инициализировать ERRNO нулем, прежде чем пытаться выполнить вывод

Используя следующую программу awk:

$ cat nonFatal.awk 
BEGIN {
    PROCINFO["NONFATAL"] = 1
    ERRNO = 0
    print "hi" > "/no/such/file"
    if (ERRNO) {
        print("Output failed:", ERRNO) > "/dev/stderr"
        exit 1
    }
}

ошибка по-прежнему фатальна в gawk 4.0 и 4.1

$ gawk -f nonFatal.awk 
gawk: nonFatal.awk:4: fatal: can't redirect to `/no/such/file' (No such file or directory)

Но в gawk 4.2.1 это работает (я скомпилировал gawk 4.2.1 как gawk-4.2.1):

$ ./gawk-4.2.1 -f /var/tmp/nonFatal.awk 
Output failed: No such file or directory
...