Поиск после матча один раз в строке - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь создать сценарий для получения всех ответов Apache после определенного слова «statusDescription», но у меня проблема в том, что я продублировал вывод для некоторых строк, так как совпавшее слово или ответ могут быть записаны 2 раза при одном и том жестрока

Пример журнала "1 строка":

GET/en?status=1&newMainBalance=5486&serviceAmount=700&ExternalTrxId=asdf&PgTrxId=tfpsadf&amount=0&statusDescription=Failed&customerCode=1.1&newDedicatedBalance=0&secureHash=56a7sdyf&paidAmount=1000&responseMsg=%a1%a1%A1(PG_ID)&language=enHTTP/1.1"200186243**1/1210669**1"-""-""-""https://example.com.eg?statusDescription=Failed&externalTrxId=123&status=203&secureHash=asdf&pgTrxId=asdf

Я попробовал следующую команду, чтобы получить любое совпадение между "statusDescription" и "&"

cat test.txt  | perl -nle'print $1 while /statusDescription(.*?)\&/g'
cat test.txt  | perl -nle'print $1 while /statusDescription(.*?)\&/g'

вывод:

= Failed
= Failed

i, за исключением того, что результат будет только 1 строкой, такой как

= Сбой

или

= Сбой = Сбой

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

-l производит печать строки после каждого print.

. Следующее будет печатать значение (первого) поля statusDescription запрошенного URL (при игнорированииURL реферера).Он даже будет правильно декодировать значение для вас (если он содержит экранированные символы, такие как + или %20).

perl -MURI -MURI::QueryParam -nle'
   my ($request_url) = /^\S+\s+(\S+)/
      or next;
   $request_url = URI->new($request_url, "http");
   my $status = $request_url->query_param("statusDescription")
      or next;
   print $status;
' test.txt
1 голос
/ 01 апреля 2019

Вы использовали -l параметр без значения.Цитировать из perlrun :

Если октнум опущен, для $\ устанавливается текущее значение $/

, которое по умолчанию равно\n.Следовательно, к каждому отпечатку автоматически добавляется \n.

$  echo 'Match=once& should only Match=twice& once' | perl -nle 'print "MATCH ->$1<-" while /Match(.*?)&/g'
MATCH ->=once<-
MATCH ->=twice<-

# the same without -l
$ echo 'Match=once& should only Match=twice& once' | perl -ne 'print "MATCH ->$1<-" while /Match(.*?)&/g'
MATCH ->=once<-MATCH ->=twice<-

# if your post-processing requires matches from different lines to appear
# on separate lines then append a conditional print "\n" at the end
$ echo 'Match=once& should only Match=twice& once' | perl -ne 'print "MATCH ->$1<-" while /Match(.*?)&/g; print "\n" if $1'
MATCH ->=once<-MATCH ->=twice<-
$ echo 'nomatch=once& should only nomatch=twice& once' | perl -ne 'print "MATCH ->$1<-" while /Match(.*?)&/g; print "\n" if defined $1'
$

Для $/ (разделитель входной записи) и $\ (разделитель выходной записи) см. Также perlvar .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...