Ich habe eine Datei mit über 1000 Bezeichnern, die ich von Bash verwende
for desig in $(desfile)
do
grep $desig in listfile
done
listfile kann alle 1 Million + Zeilen, also ist Geschwindigkeit wichtig
Das Problem ist, dass Bezeichnungen wie
PA0EHH
DL/PA0EHH
das PA0EHH
gibt es zweimal
Ich habe festgestellt, dass awk selektiver sein könnte, aber quälend langsam ist.
Antwort1
grep -xF -f desfile listfile
Oder, wenn desfile
es sich um einen Befehl handelt,
grep -xF -f <(desfile) listfile
oder,
desfile | grep -xF -f /dev/stdin listfile
Die hier verwendeten Optionen sind
-x
erfordert eine Übereinstimmung über die gesamte Länge einer Zeile. Dies möchten Sie verwenden, um Teilzeichenfolgen in Zeilen nicht zuzuordnen.-F
verwendet Zeichenfolgenvergleiche statt regulärer Ausdrücke. Dies beschleunigt die Abfrage und ist erforderlich, wenn Ihre Muster Zeichen enthalten, die in regulären Ausdrücken speziell sind (ohne dass Sie möchten, dass sie speziell sind).-f filename
, lesen Sie die Muster aus einer Datei und nicht aus Zeichenfolgen in der Befehlszeile. Dies funktioniert für eine moderate Anzahl von Mustern. Wenn Sie vielevieleMuster, kann es sein, dass Ihnen der Speicher ausgeht. In diesem Fall möchten Sie möglicherweisedesfile
(oder die Ausgabe,desfile
wenn es sich um einen Befehl handelt) in mehrere kleinere Dateien aufteilensplit
und diese dann durchlaufen. In jedem Fall würden Sienichtgrep
möchte für jedes Muster einmal aufrufen !
Antwort2
Wenn Sie prüfen, ob Ihr Bezeichner der Anfang jeder Zeile ist, können Sie
grep ^$desig listfile
Wenn Sie die Suche auf den ersten Treffer beschränken möchten, fügen Sie switch hinzu -m 1
.
Wenn Sie eine feinere Suche benötigen, versuchen Sie es mit regulären Ausdrücken:
testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b
beide entsprechen genau 2, je nach Anwendungsfall. Und um zu verhindern, dass grep beispielsweise erkennt2/2
echo "2/2 2" | grep -e [^\/]\\b$testval\\b
Farben in meinem Bash nur die einsamen 2.
Antwort3
Da die Leistung ein Problem darstellt, sollten Sie die Verwendung in Erwägung ziehen , das in vielen Fällen ripgrep
schneller abschneidet als .grep