Доступ к коду возврата последней команды в AWK

Это удалит все ) из любой строки, содержащей ESCAPED :

sed '/ESCAPED/s/)//g' filename

Чтобы изменить файл на месте:

sed -i.bak '/ESCAPED/s/)//g' filename

Как это работает

  • / ESCAPED /

    Выбираются только те строки, которые содержат ESCAPED .

  • s /) // g

    Для выбранных строк удаляются все ) .

    Команда замены обычно выглядит как s / old / new / , которая ищет регулярное выражение old и заменяет его на new . В нашем случае старый - это ) , а новый - это пустая строка. Следовательно ) удаляется. g в конце команды указывает sed делать это для каждого появления ) в строке, а не только для первого.

2
06.11.2017, 17:41
2 ответа

В конвейере команды выполняются одновременно. В том-то и дело, что вывод одного подается другому в режиме реального времени.

Статус выхода команды известен только тогда, когда она возвращается. Если вы хотите, чтобы awkобработал вывод foo, а также получил доступ к его статусу выхода, вам нужно будет запуститьawkпослеfooпосле сохранения вывода fooгде-то вроде:

foo > file
awk -v "rc=$?" '{print rc, $0}' < file

В качестве альтернативы вы могли бы awkзапускать fooсам по себе (ну, все еще через оболочку для интерпретации командной строки ), читать ее вывод (через канал через его cmd | getlineинтерфейс наpopen())и получить статус выхода с помощью:

awk -v cmd=foo '
  BEGIN {
    while ((cmd | getline) > 0) {
      print
    }
    rc = close(cmd)
    print rc
  }'

Однако обратите внимание, что способ awkкодирования состояния выхода варьируется от одной awkреализации к другой. В одних это статус прямо как возвращенный waitpid()или pclose(), в других это тот, что разделен на 256 (даже когда fooубит сигналом )... хотя вы должны быть в состоянии полагайтесь на rcравным 0 тогда и только тогда, когда команда была успешной.

В случае с gawk, оно недавно изменилось .

Или вы могли бы передать статус выхода в конце через канал:

(foo; echo "$?") | awk '
   {saved = $0}
   NR > 1 {
     # process the previous line
     $0 = prev
     print "output:", $0
   }
   {prev = saved}
   END{rc = prev; print rc}'

(предполагая, что вывод fooзаканчивается символом новой строки, когда он не пустой (является действительным текстом )).

Или подается по отдельной трубе. Например, в Linux и с оболочкой, отличной от ksh93:

{ : extra pipe | { (foo 3<&-; echo "$?" > /dev/fd/3) | awk '
  {print}
  END {getline rc < "/dev/fd/3"; print rc}'
} 3<&0 <&4 4<&-; } 4<&0
5
27.01.2020, 21:55

Используйте команду type и так далее:

type test > /dev/null 2>&1
echo $?
0

type fsfsf > /dev/null 2>&1
echo $?
1
0
27.01.2020, 21:55

Теги

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