Разница между --
и -
заключается в том, что при использовании -
параметры -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
Попробуйте это, если у вас есть только одно расширение домена.
awk -F '.' '!seen[$(NF-1)"."$NF]++' file
domain.com
domain.net
anotherdomain.com
Попробуйте это,
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
Пояснение:
sort
перевернутый файл и удалить повторяющиеся строки. Этот шаг сгруппирует домены/поддомены «одного типа» вместе с самым коротким впереди. awk
будет выглядеть, если следующая часть того же типа (сохранена как регулярное выражение в переменнойdom_regex
). Если нет, он напечатает строку и установит новый dom_regex
. В противном случае строка пропускается.