Ein Suchmuster für eine dezimale IP
Code: Alles auswählen
'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[^ ]+' sei hier "A"
Zuerst mal eine Liste der doppelten IP aufstellen:
Code: Alles auswählen
cat LOG | sed 's@^.* \(A \).* \(A \).*$@\1 \2@' > Temp-Datei
# soll aus Zeilen mit mehreren IP eine Zeile mit nur zwei IP machen.
# (Bis auf das letzte "*" sind nach "A" und "*" Leerzeichen im Ausdruck)
Jetzt greppe ich nach genau diesen Zeilen und gebe nur die aus, die doppelt gleich sind:
Code: Alles auswählen
cat Temp-Datei | \
egrep "^A A$" | awk '$1==$2 {print $1}' | sort | uniq > Liste-Datei
# Funktioniert '$1==$2' bei awk ?
Damit habe ich eine Liste der IP, die doppelt auftauchen.
Diese Liste geht jetzt in eine FOR-Schleife, sequentielle Abarbeitung:
Code: Alles auswählen
cd /dev/shm
cat LOG > IN
for i in $(< Liste-Datei) ; do
cat IN | \
sed 's@^\(.* \)\($i \)\(.* \)\($i \)\(.*\)$@\1\2\3\5@' > OUT
# (Bis auf die letzte Gruppenklammer sind auch hier Leerzeichen im Ausdruck.)
mv --force OUT IN
done
(Hoffentlich ist das RAM-Laufwerk dafür schnell genug)
Ist ein bischen holprig, aber einen regulären Ausdruck mit einem regulären Ausdruck in einem sed-Durchgang abzugleichen?
Und bei HOLD- und Pattern-Space bin ich nicht stabil.

Syntax korrekt? Soll eher eine Idee sein, die Aufgabe mehrstufig zu erledigen, statt in einem sed-Befehl.
(Und Du hast sed, grep und awk dabei

)