Ich würde dies in awk tun:
FNR == NR { pattern[NR] = $0; next }
{
for (i in pattern) {
if ($0 ~ pattern[i]) {
print
delete pattern[i]
continue
}
}
}
wie folgt aufgerufen werden:
awk -f script.awk patterns infile
wo patterns
Ihre Muster enthält und infile
ist die Datei, die Sie suchen möchten.
Der erste Befehl liest die Muster in ein Array; Der zweite Befehl (nur für Dateien nach der ersten Datei ausgeführt) führt eine Schleife über die Muster, druckt übereinstimmende Linien, löscht das Muster aus dem Array und überspringt den Rest der Muster.
Ein Beispiel Eingabe von
line with pattern1
another line with pattern1
line with pattern2
pattern1 again
pattern3 now
and pattern2
und einer Pattern-Datei
pattern1
pattern2
pattern3
die Ausgabe
$ awk -f script.awk patterns infile
line with pattern1
line with pattern2
pattern3 now
zu optimieren, Ihnen einen Scheck nach der delete
Anweisung hinzufügen könnte Sehen Sie, ob irgendwelche Muster übrig sind, und verlassen Sie, wenn nicht.
Ich denke nicht, dass es mit Grep möglich ist ... fügen Sie bitte Beispieleingabe für beide Dateien und erwartete Ausgabe hinzu – Sundeep