Используйте только sed / BASH, чтобы конвертировать расширенный IPv6 в arpa с обратным клевом для PTR - PullRequest
0 голосов
/ 07 декабря 2018

У меня много IPv6-адресов, с которыми я работаю, но, скажем, сегодня это: 2001:abc::1

Я уже могу расширить его с помощью BASH до: 2001:0abc:0000:0000:0000:0000:0000:0001

Мне нужновзять этот расширенный IPv6 и превратить его в клочок (плюс строка arpa) для моего PTR, так это выглядит так:

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.b.a.0.1.0.0.2.ip6.arpa

Я позволю awk или другим ответам нижнего стека принести пользу сообществу, BASH и функции в порядке, но одна строка sed потрясет мой мир.


Примечание: была дискуссия о том, что это «настоящая проблема».Мои сценарии используют только sed, нигде awk и склоняются к /sh больше /bash.Я считаю навыки, необходимые для поддержания сценариев частью фактической «зависимости», и поэтому я избегаю awk.Однако, чтобы быть полезными для сообщества, ответы awk должны приветствоваться здесь.Также приветствуется функция BASH, не использующая awk.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Однострочник GNU sed, вероятно, в основном для демонстрации того, как не следует использовать sed для этого:

sed 's/://g;s/^.*$/\n&\n/;tx;:x;s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/;tx;s/\n//g;s/\(.\)/\1./g;s/$/ip6.arpa/'

Разбит и прокомментировал:

# Remove all the colons
s/://g

# Embed line between two newlines
s/^.*$/\n&\n/

# Reset flag tested by t
tx

# Label to jump to
:x

# Swap two characters
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/

# Jump to label if substitution did something
tx

# Remove newlines
s/\n//g

# Insert period after each character
s/\(.\)/\1./g

# Append rest of desired string
s/$/ip6.arpa/

Перестановка строктехника взята из руководства по GNU sed .

Единственное, что на самом деле требует GNU sed - это вставка новых строк с помощью \n;если вместо s/^.*$/\n&\n/ вы используете буквальные символы новой строки, как в

s/^.*$/\
&\
/

, скрипт должен запускаться с любым sed.

0 голосов
/ 08 декабря 2018

Использование любого awk в любой оболочке в любой системе UNIX:

$ awk '{
    gsub(/:/,"")
    for (i=length($0); i>0; i--) {
        printf "%s.", substr($0,i,1)
    }
    print "ip6.arpa"
}' file
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.b.a.0.1.0.0.2.ip6.arpa
0 голосов
/ 07 декабря 2018
rarpa() {
  local idx s=${1//:}
  for (( idx=${#s} - 1; idx>=0; idx-- )); do
    printf '%s.' "${s:$idx:1}"
  done
  printf 'ip6.arpa\n'
}

rarpa '2001:0abc:0000:0000:0000:0000:0000:0001'

... испускается как вывод:

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.b.a.0.1.0.0.2.ip6.arpa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...