grep selektiv

grep selektiv

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 PA0EHHgibt es zweimal

Ich habe festgestellt, dass awk selektiver sein könnte, aber quälend langsam ist.

Antwort1

grep -xF -f desfile listfile

Oder, wenn desfilees sich um einen Befehl handelt,

grep -xF -f <(desfile) listfile

oder,

desfile | grep -xF -f /dev/stdin listfile

Die hier verwendeten Optionen sind

  • -xerfordert eine Übereinstimmung über die gesamte Länge einer Zeile. Dies möchten Sie verwenden, um Teilzeichenfolgen in Zeilen nicht zuzuordnen.
  • -Fverwendet 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öglicherweise desfile(oder die Ausgabe, desfilewenn es sich um einen Befehl handelt) in mehrere kleinere Dateien aufteilen splitund diese dann durchlaufen. In jedem Fall würden Sienichtgrepmö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 ripgrepschneller abschneidet als .grep

verwandte Informationen