Ich habe zwei Dateien: master.tbl
undsites.lst
Die Datei master.tbl
ist eine Liste von Sites mit ihren Portkonfigurationen, Portnamen, IP-Adressen usw. Es gibt Zeilen mit Sitebeschreibungen, Kommentaren usw., die jedoch irrelevant sind. Die Zeilen mit den Sitekonfigurationen sind folgendermaßen angeordnet und durch Leerzeichen getrennt:
{server} {SITE NAME} {port name} {configuration flags}
Die Portnamen bestehen aus dem Sitenamen in Kleinbuchstaben, einem Bindestrich, einem „P“ und der Portnummer.
Beispiel:
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
sites.lst
ist eine Liste der Sites, nach denen ich in der Datei suchen muss master.tbl
.
Ich muss jede Zeile, die ALLE der folgenden Kriterien erfüllt, auskommentieren ( #
am Anfang der Zeile ein einfügen) und den Servernamen und den Portnamen extrahieren (in eine Datei mit dem Namen ):stoplist.lst
- enthält einen Site-Namen, der in
sites.lst
- enthält "-ADM "
- hat eine Portnummer größer als „2“ (Beispiel:
hawaii23-P3
)
Im obigen Beispiel master.tbl
würde die Datei folgendermaßen aussehen:
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
... und stoplist.lst
würde enthalten (vorausgesetzt, HAWAII23
es ist in sites.lst
):
server01 hawaii23-P3
master.lst
umfasst fast 300.000 Zeilen, es manuell zu machen wäre also ... schlecht.
Antwort1
Hier ist eine awk
Lösung:
awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl
Dies liest sites.lst
zuerst und setzt $0"-ADM"
(das ist der Site-Name + die Zeichenfolge -ADM
) als Index des Arrays z
. Anschließend verarbeitet es master.tbl
den Wert -P
im 3. Feld als p
und, wenn die Bedingungen erfüllt sind (2. Feld ist in z
und p
größer als 2), druckt es das 1. und 3. Feld aus stoplist.lst
und kommentiert die Zeile aus.
Beachten Sie, dass die Datei nicht direkt bearbeitet wird, Sie können jedoch jederzeit zu einer anderen Datei umleiten und das Original überschreiben, wenn alles in Ordnung ist (bei einer aktuellen Datei gnu awk
haben Sie jedoch die Option -i inplace
).