Вы должны использовать awk вместо
awk '/ [0-9] {4} \. [0-9] {2} \. [0-9] {2} \. / {print "--------------------- \ n" $ 0; continue} / ^ / {print $ 0} '<"INPUTFILE"> "OUTPUTFILE"
в основном это работает в 2 этапа:
step1: / [0-9] {4} \. [0- 9] {2} \. [0-9] {2} \. / {print "--------------------- \ n" $ 0; continue}
означает: если он кэширует /4digits.2digits.2digits. / затем выведите «---...-- \ n», за которым следует соответствующая строка, и выполните цикл на следующей строке (= «продолжить»).
step2: / ^ / {print $ 0}
означает: если мы не совпали с указанным выше, то для всех остальных строк (т. Е. Совпадение с началом строки, поэтому даже пустая строка будет сопоставлена ), просто распечатайте эту строку.
Вам необходимо различать ошибки, которые видит curl, и ошибки, которые возвращает ваш http-сервер. Последние не являются ошибками для curl. Однако вы можете легко проверить код состояния http, добавив в ваш curl параметр
-w '\n%{http_code}\n'
Это добавит к стандартному выводу заголовок HTTP, который равен 200 для OK. Итак, ваш perl может делать что-то вроде
my $curl_result = `curl -s -S -w '\n%{http_code}\n'... 2>/dev/null`;
my @lines = split(/\n/,$curl_result);
my $httpcode = $lines[-1];
if($httpcode eq 200){ print "ok\n"; }
else{ print "error\n"; }
Оператор обратной кавычки Perl вернет (в переменную результата $curl _)STDOUT команды, которую вы запускаете. STDERR из этой команды перенесет в вызывающую программу/терминал из ваш perl-скрипт --, возможно, на ваш экран, как если бы вы сами вызвали curl
.
Чтобы захватить STDERR, вы должны (как вы начали воображать, )отбросить STDOUT или смешать их.
Вот пример удаления STDOUT и перенаправления STDERR в STDOUT, чтобы он (вместо «обычного» STDOUT )захватывался переменной perl:
my $curl_result = `curl... 2>&1 1>/dev/null`;
В качестве альтернативы можно объединить два:
my $curl_result = `curl... 2>&1`;
Я опустил середину основной команды curl
, чтобы было понятно, какую часть я изменил. В первом примере STDERR изменяется так, чтобы он указывал на то место, где STDOUT в настоящее время указывает , а затем сообщает STDOUT, что он должен уйти. Во втором примере STDERR указывает на STDOUT, смешивая их.