2012-11-29 13 views

Odpowiedz

0
sed -n '/2005057488/p' filename 

Nie wiem, czy jest to szybsze niż grep.

+0

To mało prawdopodobne. 'grep' jest przeznaczony do zrobienia tylko jednej rzeczy (zobacz moją odpowiedź) – Steve

+0

@steve, czy powinienem wtedy usunąć swoją odpowiedź? Nowość w SO. Proszę pomóż. – Anon

16

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 
+0

+1 dla GNU równoległego – Anon

+0

+1 wspaniała odpowiedź. –

+1

Bardzo jasna i precyzyjna odpowiedź! Dzięki wam =) – digvijay91

2

grep działa szybciej niż sed.

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

Wciąż Zarówno prace, aby uzyskać ten konkretny ciąg znaków w pliku

Powiązane problemy