удаление поддоменов других доменов в файле с помощью скрипта (bash, awk или подобного)

Разница между --и -заключается в том, что при использовании -параметры -xи -vтакже не устанавливаются.

$ set -vx
$ echo "$-"
himvxBHs                # The options -v and -x are set.

$ set - a b c
$ echo "$-  <>  $@"     # The -x and -v options are turned off.
himBHs  <>  a b c

Это обычный способ, которым оболочки принимают -, однако в POSIX эта опция «не указана»:

If the first argument is '-', the results are unspecified.

Довольно часто используется разница между set --и обычным set.
Это ясно объяснено в руководстве:

-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are set to the args, even if some of them begin with a -.

--указывает на «конец опций», и любой последующий аргумент, даже если он начинается с -, будет использоваться как позиционный аргумент.

$ set -- -a -b -e -f arg1
$ echo "$@"
-a -b -e -f arg1

Вместо:

$ set -a -b -e -f arg1
$ echo "$@"
arg1

Но также изменились некоторые параметры оболочки.

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

$ echo "$-"
himBHs

$ a='-f'
$ set "$a"

$ echo "$-"
fhimBHs
5
03.09.2019, 17:33
2 ответа

Попробуйте это, если у вас есть только одно расширение домена.

awk -F '.' '!seen[$(NF-1)"."$NF]++' file

domain.com
domain.net
anotherdomain.com
2
27.01.2020, 20:35

Попробуйте это,

rev file \
| sort -u \
| tr '.' ',' \
| awk '$0!~dom_regex{print;dom_regex="^"$0"[.]";};NR==1{dom_regex="^"$0"[.]";print};' \
| tr ',' '.' \
| rev

Выход:

4.3.2.1.domain.org
domain.com
anotherdomain.com
domain.net

Пояснение:

  1. sortперевернутый файл и удалить повторяющиеся строки. Этот шаг сгруппирует домены/поддомены «одного типа» вместе с самым коротким впереди.
  2. часть awkбудет выглядеть, если следующая часть того же типа (сохранена как регулярное выражение в переменнойdom_regex). Если нет, он напечатает строку и установит новый dom_regex. В противном случае строка пропускается.
  3. Перевернуть файл еще раз.
4
27.01.2020, 20:35

Теги

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