Допустим, у меня действительно большой текстовый файл (около 10.000.000 строк). Мне нужно grep
это с конца и сохранить результат в файл. Какой самый эффективный способ выполнить задачу?
command-line
sed
awk
grep
efficiency
хаос
источник
источник
tac
иgrep
добиться того, что вы хотите.grep
есть--max-count (number)
переключатель, который прерывает работу после определенного числа совпадений, которые могут вас заинтересовать.Ответы:
TAC / grep Solution
Или немного эффективнее:
Время с файлом 500 МБ:
Решение sed / grep :
Время с файлом 500 МБ: прервано через 10+ минут.
Решение awk / grep :
Время с файлом 500 МБ:
Perl / grep Решение:
Время с файлом 500 МБ:
источник
sed
,awk
Иperl
(с помощью этого метода) не в порядке , так как они читают файл с самого начала, что очень неэффективно. Я полагаю, чтоtac
это правильно.< <(tac filename)
Должен быть таким же быстрым, как конвейер: в обоих случаях команды выполняются параллельно.tac
после grep. Если у вас есть файл с 10 000 000 строк и только 2 совпадения, вамtac
нужно будет перевернуть только 2 строки, а не 10 м.grep
все равно придется пройти через все это в любом случае.tac
послеgrep
, он будет читать из трубы и поэтому не может искать. Это сделает его менее эффективным (или полностью потерпит неудачу), если количество найденных строк велико.Это решение может помочь:
источник
tac
это команда GNU. В большинстве других систем, то эквивалентtail -r
.tail -r
ограничено небольшим количеством строк, это может быть проблемой.tail -r /etc/passwd
не удается сtail: invalid option -- 'r'
. Я использую coreutils-8.21-21.fc20.x86_64.tac
(и только у GNU есть tac) многие другие Unicestail -r
. GNUtail
не поддерживает-r
Этот выходит, как только находит первое совпадение:
Ниже приведены 5 строк до и после первых двух совпадений:
Помните, что не следует использовать
-i
(без учета регистра), за исключением случаев, когда это замедляет работу grep.Если вы знаете точную строку, которую вы ищете, подумайте
fgrep
(Фиксированная строка)источник
Если файл действительно большой, не может поместиться в памяти, я буду использовать
Perl
с File :: ReadBackwards модуль изCPAN
:Затем:
источник
tac
.