Используйте логин на основе ключей на рабочем столе Linux

grep ищет шаблоны в файлах или на стандартном вводе. Вы не можете передавать строки данных для сопоставления в командной строке grep . Попробуйте следующее:

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' abd

Если вам нужно получить каждый IP-адрес в переменной:

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' abd |
while read IP
do
    echo "$IP"
done

Сравнительное тестирование производительности принятый ответ

В ответе рекомендуется выполнить отдельный вызов grep на каждая строка входного файла. Посмотрим, как это работает с файлами от 1000 до 5000 строк. Файлы abd.1000 и abd.5000 были созданы путем простого копирования исходного файла примера в вопросе. Исходный код был изменен только для использования имени файла в качестве аргумента командной строки ( $ {1:?} ) вместо жестко запрограммированного «abd».

$ wc -l abd.1000 abd.5000
  1000 abd.1000
  5000 abd.5000
  6000 total

Протестируйте пример кода в этом ответе на файле с 1000 строками:

$ cat ip-example.sh
#!/bin/sh
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' "${1:?}" |
while read IP
do
    echo "$IP"
done

$ time sh ip-example.sh abd.1000 > /dev/null

real    0m0.021s
user    0m0.007s
sys     0m0.017s
$

Выше показано, что пример в этом ответе обработал файл с 1000 строками менее чем за 1/4 секунды. Теперь посмотрим, как работает пример из принятого ответа:

$ cat accepted.sh
#!/bin/bash
while read line; do
  ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
  echo "$ip"
done < "${1:?}"

$ time bash accepted.sh abd.1000 > /dev/null

real    0m3.565s
user    0m0.739s
sys     0m2.936s
$

Хммм. Пример в принятом ответе выполняется за 3 1/2 секунды, примерно 169 раз медленнее , чем 1/40 секунды в примере для этого ответа.

Поднимем ставку и протестируем с 5000 строк:

$ time sh ip-example.sh abd.5000 > /dev/null

real    0m0.052s
user    0m0.051s
sys     0m0.029s

Примерно вдвое дольше, чтобы обработать в 5 раз больше данных .

$ time bash accepted.sh abd.5000 > /dev/null

real    0m17.561s
user    0m3.817s
sys     0m14.333s

Пример кода в принятом ответе занимает почти в 5 раз больше времени для обработки в 5 раз большего объема данных, чем для обработки 1000 строк данных.

Выводы

Пример в принятом ответе занимает 337 раз больше для обработки файла в 5000 строк, чем код ip-example.sh в этом ответе (другие ответы на этой странице должен выполняться аналогично ip-example.h ).

2
04.01.2019, 21:11
1 ответ

ZFS прекрасно справляется с использованием одного файла для пула. Впрочем, может быть, и нет. Есть несколько недостатков.

  1. Производительность. Все операции ввода-вывода ZFS теперь преобразуются в операции vnode, поэтому ZFS теперь находится поверх нескольких дополнительных уровней, чем раньше. Это оказывает значительное влияние на производительность.
  2. Надежность. ZFS обеспечивает атомарность своих транзакций, записывая свой корневой узел, называемый «уберблоком», с одним вводом-выводом, выдаваемым в 4 местоположения уберблока. ZFS запускает fsync для файла после записи уберблоков, но это оказывается не на 100% надежным .
  3. Избыточность. Один файл (или один диск в этом отношении )означает, что одна из лучших функций ZFS, исправление ошибок чтения на лету, отключена. Вы можете рассмотреть возможность использования пары файлов в конфигурации RAID1 (ZFS «зеркало» ), просто чтобы быть немного безопаснее.
4
27.01.2020, 22:02

Теги

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