Быстрый способ найти строку в файле в unix

Я хочу найти строковый шаблон в файле в unix. Я использую команду ниже:

$grep 2005057488 filename

Но файл содержит миллионы строк, и у меня много таких файлов. Самый быстрый способ получить шаблон, отличный от grep.

Ответ 1

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

Ответ 2

grep работает быстрее, чем sed.

$grep 2005057488 filename
$sed -n '/2005057488/p' filename

Тем не менее Оба работают, чтобы получить эту конкретную строку в файле

Ответ 3

sed -n '/2005057488/p' filename

Не уверен, что это быстрее, чем grep.