Почему я должен явно добавлять IPv6-адрес /128 к устройству, если у меня уже есть /64?

Два варианта:

  1. Прокрутите файлы и вызовите awkодин раз для каждого файла или
  2. Дайте сценарию awkвсе файлы и позвольте ему вычислить среднее значение для каждого и сообщить о ходе выполнения.

Сортировка результата любого из приведенных ниже решений может быть выполнена путем передачи их вывода через

sort -k2,2rn

Это выполняет обратную числовую сортировку второго поля (среднего ).


Первое решение:

#!/bin/sh

for name in "$1"/*.dat; do
    test -f "$name" || continue   # skip non-files
    awk -F '>' '/<Overall>/ { s+=$NF; n++ } END { print FILENAME, s/n }' "$name"
done

Этот сценарий ожидает имя каталога в командной строке в качестве первого и единственного аргумента командной строки. Скрипт awkнайдет все строки, содержащие строку Overall, и суммирует (вs)значение после >в этой строке. В конце вместе с именем файла выводится среднее значение. Переменная nсодержит количество добавлений к s.


Второе решение (требует GNU Awk):

#!/bin/sh

find "$1" -maxdepth 1 -type f -name '*.dat' \
    -exec awk -F '>' '/<Overall>/ { s+=$NF; n++ } ENDFILE { print FILENAME, s/n; s=n=0 }' {} +

Этот сценарий, как и первый, ожидает имя каталога в качестве единственного аргумента командной строки. Он использует findдля выполнения скрипта awkс максимально возможным количеством файлов .dat.

Сценарий awkиспользует триггер GNU Awk ENDFILEдля вывода рассчитанных значений и сброса переменных sи nпосле обработки каждого файла перед началом чтения следующего файла.

Это также могло быть написано как

#!/bin/sh

awk -F '>' '/<Overall>/ { s+=$NF; n++ } ENDFILE { print FILENAME, s/n; s=n=0 }' "$1"/*.dat

но это зависит от "$1"/*.datне расширяющегося до слишком длинного списка имен файлов (для этого также требуется, чтобы каждое .datимя было обычным файлом, что вышеприведенная команда findгарантирует с -type f).

1
26.09.2019, 12:47
1 ответ

Число после /— это размер подсети, который равен (почти )и всегда равен /64 в IPv6. Это ничего не говорит о вашей локальной машине. Как и в случае с IPv4, вам все равно придется назначать интерфейсу каждый отдельный адрес.

С IPv4 вы можете писать как 192.168.0.1/24, так и 192.168.0.1/255.255.255.0. Они означают то же самое.

В IPv6 запись<REDACTED>:48ea::1/ffff:ffff:ffff:ffff::(или даже<REDACTED>:48ea::1/ffff:ffff:ffff:ffff:0000:0000:0000:0000)стала бы немного громоздкой, поэтому используется только нотация <REDACTED>:48ea::1/64.

2
28.04.2021, 23:29

Теги

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