Grep и Regex: фильтрация поддоменов в файле

Прежде всего, извините, я должен выучить некоторый grep и regex вместо того, чтобы задавать этот вопрос, но сейчас у меня немного нехватки времени. И я определенно собираюсь выучить egrep в конце концов.

Итак, вот входные данные:

202.125.132.76          host    av.google.com
202.147.187.10          host    cms1web.google.com
202.147.187.10          host    cms2web.google.com
    "autodiscover.google.com
    "cms1web.google.com
    "cms2web.google.com
    "dialin.google.com
 - afghanistan.google.com
  - autodiscover.google.com
  - bangladesh.google.com
  - bdbkashonline.google.com
  - cms1web.google.com
*.google.com
*.ibank.google.com
*.ibankintl.google.com
*.itrade.google.com
202.125.133.232 403     host    autodiscover.google.com
104.40.82.191 - EnterpriseEnrollment.google.com
107.154.104.16 - iTrade.google.com
107.154.108.2 - MIS.google.com
116.71.129.169  testpaymentapi.google.com
119.159.231.12          host    av.google.com

Вывод должен быть

av.google.com
cms1web.google.com
cms2web.google.com
autodiscover.google.com
so on.......

Я хочу только *. * Google. com, ничего больше в результате, строка за строкой

Я не хочу, чтобы апострофы и дефисы были только на поддоменах, как показано выше.

Спасибо, если вы могли бы помочь мне:)

-1
задан 17 July 2019 в 17:30

2 ответа

Для решения такой задачи, необходимо вообразить четкие и определенные логические правила. Согласно Вашему примеру производит Вас, должен получить строки, которые состоят из:

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

Если вышеупомянутое корректно, Вы могли бы достигнуть желаемого вывода следующим cobination команд sed и grep:

sed -e '/[A-Z]/d' -e '/*/d' input.txt | grep -oP '[a-z0-9]+\.[a-z]+\.[a-z]+'

Объяснение:

  • Первое выражение (-e) удалит d все строки, которые содержат прописные буквы, вторая, удалят все строки, которые содержат подстановочный знак *, в то время как sed чтение input.txt файл.
  • Вывод sed команда передается по каналу | кому: grep.
  • Опция -o из grep покажет только часть ШАБЛОНА соответствия строки и -P говорит, что ШАБЛОН является регулярным выражением Perl. В ШАБЛОНЕ [a-z0-9]+ средства, что мы должны распознать слово, которое содержит числа или/и строчные буквы и там должны иметь по крайней мере один символ +; \. обозначает литеральную точку, потому что . имеет значение любого символа, в то время как его не оставляет обратная косая черта \.

Вывод в качестве примера, на основе входа, обеспеченного в вопросе (отмечают здесь вывод, отсортирован, и только уникальные значения печатаются):

$ sed -e '/[A-Z]/d' -e '/*/d' input.txt | grep -oP '[a-z0-9]+\.[a-z]+\.[a-z]+' | sort -u
afghanistan.google.com
autodiscover.google.com
av.google.com
bangladesh.google.com
bdbkashonline.google.com
cms1web.google.com
cms2web.google.com
dialin.google.com
testpaymentapi.google.com
0
ответ дан 23 October 2019 в 23:33
$ grep -Po '^[^-*"]*?\K[[:alnum:]-]+\.google\.com$' input
av.google.com
cms1web.google.com
cms2web.google.com
autodiscover.google.com
testpaymentapi.google.com
av.google.com
  • нежадно соответствуйте и отбросьте последовательность символов не включая -, *, или "

затем

  • соответствие и вывод последовательность алфавитно-цифровых символов и дефисов (хотя Ваш вход не имеет никого, они законны в доменном имени), сопровождаемый .google.com
1
ответ дан 23 October 2019 в 23:33

Другие вопросы по тегам:

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