Прежде всего, извините, я должен выучить некоторый 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, ничего больше в результате, строка за строкой
Я не хочу, чтобы апострофы и дефисы были только на поддоменах, как показано выше.
Спасибо, если вы могли бы помочь мне:)
Для решения такой задачи, необходимо вообразить четкие и определенные логические правила. Согласно Вашему примеру производит Вас, должен получить строки, которые состоят из:
Если вышеупомянутое корректно, Вы могли бы достигнуть желаемого вывода следующим 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
$ 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