Verwenden Sie eine Listendatei, um eine zweite Liste aus einer Masterdatei zu extrahieren (und kommentieren Sie einige Zeilen aus) ... WIE?

Verwenden Sie eine Listendatei, um eine zweite Liste aus einer Masterdatei zu extrahieren (und kommentieren Sie einige Zeilen aus) ... WIE?

Ich habe zwei Dateien: master.tblundsites.lst

Die Datei master.tblist 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.lstist 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

  1. enthält einen Site-Namen, der insites.lst
  2. enthält "-ADM "
  3. hat eine Portnummer größer als „2“ (Beispiel: hawaii23-P3)

Im obigen Beispiel master.tblwü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.lstwürde enthalten (vorausgesetzt, HAWAII23es ist in sites.lst):

server01 hawaii23-P3

master.lstumfasst fast 300.000 Zeilen, es manuell zu machen wäre also ... schlecht.

Antwort1

Hier ist eine awkLö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.lstzuerst und setzt $0"-ADM"(das ist der Site-Name + die Zeichenfolge -ADM) als Index des Arrays z. Anschließend verarbeitet es master.tblden Wert -Pim 3. Feld als pund, wenn die Bedingungen erfüllt sind (2. Feld ist in zund pgrößer als 2), druckt es das 1. und 3. Feld aus stoplist.lstund 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 awkhaben Sie jedoch die Option -i inplace).

verwandte Informationen