У меня есть файл журнала nginx, который я хочу разделить на несколько файлов на основе Ips.Например, у меня есть ips1.txt
и ips2.txt
.Каждый файл имеет половину числа уникальных ips файла журнала.Файл журнала nginx имеет следующий формат:
172.0.0.10 - [24/Jun/2018:11:00:00 +0000] url1 GET url2 HTTP/1.1 (200) 0.000 s 2356204 b url3 - - [HIT] - s - Mozilla/5.0 (X11; CrOS x86_64 10452.99.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.203 Safari/537.36
172.0.0.11 - [24/Jun/2018:11:00:00 +0000] url1 GET url2 HTTP/1.1 (200) 0.000 s 307 b url3 - - [HIT] - s - Mozilla/5.0 (X11; CrOS x86_64 10452.99.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.203 Safari/537.36
Итак, все, что я делаю, чтобы получить все строки, начинающиеся с IP, который находится внутри моего файла шаблона:
cat log.txt | grep -f ips1.txt > part1.txt
cat log.txt | grep -f ips2.txt > part2.txt
Я знаю, что я занимаюсь поиском во всей строке, а не только в начале.Это замедляет поиск и тратит больше памяти, чем могло бы быть.Я знаю, что если у меня есть только один шаблон для поиска, я мог бы использовать awk
(например, awk '{if($1 == "172.0.0.10")print;}' log.txt
), но я не знаю, как сделать это с файлом шаблона, используя grep.
Так что я хочуэто тратить меньше памяти и ускорить поиск, просто посмотрев в начало строки.Мой файл журнала имеет много ГБ, и, если это возможно, я сэкономлю много времени.
РЕДАКТИРОВАТЬ:
Мои файлы ips * .txt создаются на основе количества потоков, которые у меня есть.Ниже вы можете увидеть, как мой код:
NUM_THREADS=8
export LC_ALL=C
unpigz -c log.gz | awk '{print $1;}' | LC_ALL=C sort -S 20% -u > all_ips.txt
lines_arq=$(wc -l all_ips.txt | cut -d' ' -f1)
lines_each_file=$(($lines_arq / $NUM_THREADS + 50))
split --lines=$lines_each_file all_ips.txt 2018/prefixo.
zgrep log.gz -Fwf 2018/prefixo.aa | pigz > file1.gz &
zgrep log.gz -Fwf 2018/prefixo.ab | pigz > file2.gz &
...
zgrep log.gz -Fwf 2018/prefixo.ah | pigz > file8.gz &
wait
unpigz -c file1.gz | pypy script.py -i - -o onOff -s 11:00:00 -m testing -y 2018 | pigz > onOff-file1.gz &
...
unpigz -c file8.gz | pypy script.py -i - -o onOff -s 11:00:00 -m testing -y 2018 | pigz > onOff-file8.gz &