Как получить последнюю группу текста между двумя шаблонами с помощью sed или awk - PullRequest
0 голосов
/ 24 января 2020

На этом сайте есть несколько ответов о том, как захватить текст между двумя шаблонами и распечатать каждую группу, но меня интересует только последняя группа. Я делаю это на Ма c, а не Linux.

Мой вывод поступает с echo "" | openssl s_client -showcerts -connect oidc.eks.us-east-1.amazonaws.com:443 2>&1 |\ sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p;/-END CERTIFICATE-/a\', и я хочу получить последний сертификат, между -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- включительно.

Чтобы обобщить, в тексте типа

start
a
b
c
end
start
d
e
f
end
start
g
h
i
end

как я могу просто получить

start
g
h
i
end

Причина, по которой мне это нужно, заключается в том, что мне нужно получить последний сертификат в цепочке, получивший отпечаток с помощью openssl x509 -fingerprint -noout для программного создания поставщика AWS OID C.

Ответы [ 4 ]

2 голосов
/ 24 января 2020
$ awk '/start/{rec=""; f=1} f{rec=rec $0 ORS} /end/{f=0} END{printf "%s", rec}' file
start
g
h
i
end
1 голос
/ 24 января 2020

Не могли бы вы попробовать следующее решение tac + * 1002. * Решение с подробным объяснением:

tac Input_file |            ##Print Input_file in reverse style, from bottom to top.
awk '                       ##Starting awk program from here.
  /end/,/start/{            ##Printing from range starting from end to start here.
    print
    if($0=="start"){        ##Checking if current line is start then exit from awk program.
      exit
    }
  }
' |                         ##Sending awk output to next command. 
tac

Вывод будет следующим.

start
g
h
i
end
0 голосов
/ 24 января 2020

У меня это работает так:

echo "" | openssl s_client -showcerts -connect oidc.eks.us-east-1.amazonaws.com:443 2>&1 |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p;/-END CERTIFICATE-/a\' | tail -r |\
sed -n '1,/-BEGIN CERTIFICATE-/ p' | tail -r

tail -r очень полезно для этого.

0 голосов
/ 24 января 2020

Вставьте нулевой байт перед каждым start. После этого выведите последнюю «строку», где строки разделены нулевыми байтами.

sed 's/start/\x00&/` | tail -z -n1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...