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
).
ZFS прекрасно справляется с использованием одного файла для пула. Впрочем, может быть, и нет. Есть несколько недостатков.