grep
selbst ist dazu in der Lage. Verwenden Sie einfach das Flag -f
:
grep -f <patterns> <file>
<patterns>
ist eine Datei, die in jeder Zeile ein Muster enthält; und <file>
ist die Datei, in der Sie suchen möchten.
Beachten Sie, dass grep
erzwungen wird Um jede Zeile als Muster zu betrachten, selbst wenn der Inhalt jeder Zeile wie ein regulärer Ausdruck aussieht, sollten Sie das Flag -F, --fixed-strings
verwenden .
grep -F -f <patterns> <file>
Wenn es sich bei Ihrer Datei um eine CSV-Datei handelt, können Sie Folgendes tun:
grep -f <(tr ',' '\n' < data.csv) <file>
Betrachten Sie als Beispiel die Datei "a.txt" mit den folgenden Zeilen:
alpha
0891234
beta
Nun die Datei "b.txt", mit den Zeilen:
Alpha
0808080
0891234
bEtA
Die Ausgabe des folgenden Befehls ist:
grep -f "a.txt" "b.txt"
0891234
Sie müssen überhaupt nicht for
-Schleife hier; grep
selbst bietet diese Funktion an.
Verwenden Sie jetzt Ihre Dateinamen:
#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"
Sie können ','
ändern zu dem Trennzeichen, das Sie in Ihrer Datei haben.
Eine andere Lösung:
- benutze
awk
und erstellen Sie Ihren eigenenhash
(z. B. ahash), die alle von Ihnen selbst gesteuert werden. - ersetze
$0 to $i
und Sie können beliebige Felder abgleichen.
awk -F"," '
{
if (nowfile==""){ nowfile = FILENAME; }
if(FILENAME == nowfile)
{
hash[$0]=$0;
}
else
{
if($0 ~ hash[$0])
{
print $0
}
}
} ' xx yy