grep
jest generalnie tak szybki, jak to tylko możliwe. Jest przeznaczony tylko do jednej rzeczy i jednej rzeczy - i robi to, co robi bardzo dobrze. Możesz przeczytać, dlaczego here.
Jednak, aby przyspieszyć działanie, można wypróbować kilka rzeczy. Po pierwsze, wygląda na to, że szukany wzór jest stałym ciągiem. Na szczęście grep
ma „fixed-strings” opcję:
-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.)
Po drugie, ponieważ grep
jest ogólnie dość powolna na UTF-8
, można spróbować wyłączyć obsługę języka narodowego (NLS) poprzez tworzenie środowiska LANG=C
. W związku z tym, można spróbować tej mikstury:
LANG=C grep -F "2005057488" file
Po trzecie, nie było jasne, w swoim pytaniu, ale jeśli tylko stara się dowiedzieć, czy istnieje coś raz w pliku, można również spróbować dodać maksymalną liczbę razy, aby znaleźć wzór. Dlatego, gdy -m 1
, grep
zostanie zamknięty natychmiast po znalezieniu pierwszego wystąpienia. Twoje polecenie mogłoby wyglądać tak:
LANG=C grep -m 1 -F "2005057488" file
Wreszcie, jeśli masz procesor wielordzeniowy, można dać GNU parallel GO. Ma nawet explanation of how to use it with grep. Aby uruchomić 1,5 zadań na rdzeniu i dać 1000 argumentów grep
:
find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}
Do grep
duży plik w użyciu równoległej --pipe
:
< bigfile parallel --pipe grep STRING
zależności od dysków i procesorów może być szybciej czytać większy bloki:
< bigfile parallel --pipe --block 10M grep STRING
To mało prawdopodobne. 'grep' jest przeznaczony do zrobienia tylko jednej rzeczy (zobacz moją odpowiedź) – Steve
@steve, czy powinienem wtedy usunąć swoją odpowiedź? Nowość w SO. Proszę pomóż. – Anon