Похоже, что некоторые из ваших полей данных используются для создания сертификатов SSL, поэтому многие поля могут содержать ПРОСТРАНСТВА, т. Е. Город, название организации и т. Д. Вот почему вам нужно много строк awk (???). Вот один способ, который может помочь вам преодолеть эти проблемы. Таким образом, вместо преобразования существующей логики кода, цель состоит в том, чтобы найти имя домена, выполнив поиск по подстроке CN=
и извлекая ее соответствующее значение.
awk '
!/^R/{
start = index($0, "CN=")+3
end = index(substr($0, start), "/")
domain = end ? substr($0, start, end-1) : substr($0, start)
print $2, domain
}
' file.txt
Где:
- мы используем
index()
, чтобы найти начальную позицию подстроки CN=
, +3
будет отправной точкой доменного имени
- затем мы ищем следующую
/
, чтобы получить конечную позицию этого домена. если он находится в конце строки, /
не будет и, следовательно, end
будет равно '0'
- затем мы получаем доменное имя между подстрокой
CN=
и следующей '/', используя substr($0, start, end-1)
или конец строки, используя substr($0, start)
.
Короткая версия:
awk '!/^R/{s=index($0, "CN=")+3; e=index(substr($0, s), "/"); print $2, substr($0, s, e ? e-1 : 253)}' file.txt
где 253
- самое длинное доменное имя, которого может быть достаточно для ваших нужд.
Обновление:
На самом деле, гораздо проще просто использовать match()
, но смысл тот же:
awk '!/^R/{if(match($0, "/CN=([^/]*)")) print $2, substr($0, RSTART+4, RLENGTH-4)}' file.txt