awk — Есть ли в gawk что-нибудь похожее на макрос __LINE__?

Я использую gawk и хочу знать, можно ли вывести строку скрипта. Я проверил руководство по gawk и нашел информацию об переменных с автоматической установкой но ничего похожего на __LINE__ нет в списке. Спасибо

Чтобы уточнить здесь, я имею в виду фактическую строку сценария awk, а не то, что я читаю. Поэтому, если я делаю cat foo | script.awk, я ищу номер строки в script.awk. В основном я хотел бы показать номер строки, в которой произошла ошибка в моем скрипте, если это возможно.


person user2672807    schedule 14.10.2013    source источник
comment
Интерпретатор awk довольно хорошо сообщает вам, в какой строке произошла ошибка, например. awk: avg.awk:20: ^ syntax error. Для чего бы вы это использовали?   -  person Fredrik Pihl    schedule 15.10.2013
comment
@Fredrik Меня не беспокоят эти ошибки, я имею в виду ошибки в моем скрипте, где я должен делать print "exiting on error!"; exit 1;   -  person user2672807    schedule 15.10.2013
comment
Измените код выхода на что-то уникальное, что позволит вам легко идентифицировать эту строку, выполнив поиск, например. exit 42. Shell интерпретирует каждый код выхода больше 0 как сбой, поэтому все ваши && и ||, $? будут работать как положено.   -  person Fredrik Pihl    schedule 15.10.2013
comment
Вы пробовали dgawk, встроенный отладчик в GNU awk 4.x?   -  person Todd A. Jacobs    schedule 15.10.2013
comment
@Fredrik Спасибо, но я ищу что-то, что может автоматически получать номера строк. У меня много мест, где программа может завершиться из-за ошибки.   -  person user2672807    schedule 15.10.2013
comment
@Code Я этого не пробовал. Я ищу что-то, что будет отображаться и для пользователя. Спасибо за предложения, хотя.   -  person user2672807    schedule 15.10.2013


Ответы (1)


Нет. Дайте нам знать, если вам нужны предложения по обходным путям, например. создание нового сценария awk из исходного сценария awk:

$ cat tst.sh
tmp="/usr/tmp/tmp.awk"
trap 'rm -f "$tmp"; exit' 0
> "$tmp"
chmod oug+x "$tmp"

awk '{ sub(/__LINE__/,NR); print }' <<! > "$tmp" && "$tmp"
awk 'BEGIN {
    print "this is line", __LINE__
    print "this is line", __LINE__
    print "this is line", __LINE__
}'
!
$ ./tst.sh
this is line 2
this is line 3
this is line 4
person Ed Morton    schedule 14.10.2013
comment
К сожалению, это похоже на правильный ответ. Интересное решение! - person user2672807; 15.10.2013