Я хочу найти строковый шаблон в файле в unix. Я использую команду ниже:
$grep 2005057488 filename
Но файл содержит миллионы строк, и у меня много таких файлов. Самый быстрый способ получить шаблон, отличный от grep.
Я хочу найти строковый шаблон в файле в unix. Я использую команду ниже:
$grep 2005057488 filename
Но файл содержит миллионы строк, и у меня много таких файлов. Самый быстрый способ получить шаблон, отличный от grep.
grep
, как правило, так же быстро, как и получается. Он предназначен только для одного и только одного - и он делает то, что делает это очень хорошо. Вы можете прочитать, почему здесь.
Однако, чтобы ускорить работу, вы можете попробовать несколько вещей. Во-первых, похоже, что шаблон, который вы ищете, является фиксированной строкой. К счастью, grep
имеет параметр "фиксированных строк":
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)
Во-вторых, поскольку grep
обычно довольно медленный на UTF-8
, вы можете попробовать отключить поддержку национальных языков (NLS), установив среду LANG=C
. Поэтому вы можете попробовать эту смесь:
LANG=C grep -F "2005057488" file
В-третьих, в вашем вопросе было неясно, но если вы только пытаетесь найти, если что-то существует в вашем файле, вы также можете попробовать добавить максимальное количество раз, чтобы найти шаблон. Поэтому, когда -m 1
, grep
выйдет сразу после первого появления. Теперь ваша команда может выглядеть так:
LANG=C grep -m 1 -F "2005057488" file
Наконец, если у вас многоядерный процессор, вы можете дать GNU parallel a go. Он даже поставляется с объяснением того, как использовать его с grep. Чтобы запустить 1.5 задания на ядро и дать 1000 аргументов grep
:
find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}
В grep
большой параллельный файл используется --pipe
:
< bigfile parallel --pipe grep STRING
В зависимости от ваших дисков и процессоров быстрее читать более крупные блоки:
< bigfile parallel --pipe --block 10M grep STRING
grep работает быстрее, чем sed.
$grep 2005057488 filename
$sed -n '/2005057488/p' filename
Тем не менее Оба работают, чтобы получить эту конкретную строку в файле
sed -n '/2005057488/p' filename
Не уверен, что это быстрее, чем grep.