2017-11-01 7 views
2

Ich habe zwei verschiedene Funktionen, die ich geschrieben habe, jede mit ihrer eigenen AWK, um nach einer bestimmten Datei in mehreren Verzeichnissen zu suchen und die Informationen auszugeben, die ich brauche. Beide Funktionen drucken den DATEINAME und ein bestimmtes Feld, das ich brauche, und funktionieren ganz gut alleine. Ich möchte sie für eine robustere Ausgabe kombinieren.Mehrere awk-Ausgabe kombinieren, um auf einer Zeile zu drucken

Ich bin kein Programmierer. Ich schrieb diese, während ich über Awk las, als ich ging.

Funktion 1

cver() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
("-h"|help) echo "'cver' allows us to see the software version 
running on all Company Juniper devices.\n'cver' is especially helpful 
in determining which devices require a software upgrade.\n\nOptions 
are -b for bb, -c for cpe, -e for etech, -k for core, and -o for 
ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep 
name";; 
(*) echo "Unrecognized or incomplete command.\nUse -h for help.";; 
    esac 
[ $X ] && awk -vSRCH="$3" '/JUNOS/ && /boot/ && $5 ~ "^[[]" SRCH 
{sub ("/show.version", "", FILENAME); sub (".*/", "", FILENAME); 
print $5 " " FILENAME}' ~/svn/nw_config_data/*${X}.domain.net/show.version | sort 
} 

Input/Output Beispiel:

% cver -k <---input 
[11.4R10.3] device.core.domain.net <---ouput 

Function 2

cmod() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
esac 
awk '/Model/ {sub ("/show.version", "", FILENAME); 
sub (".*/", "", FILENAME); print FILENAME " " $2}' 
~/svn/nw_config_data/*${X}.domain.net/show.version | sort 
} 

Input/Output Beispiel:

% cmod -k <---input 
device.core.domain.net mx480 <---output 

Was diese Skripte tun, geht in unser Verzeichnis ~/svn/nw_config_data/und dort ist ein Verzeichnis für jedes Gerät, das wir implementiert haben. In jedem Geräteverzeichnis befinden sich Dateien für die Konfiguration sowie einige show-Befehle. Die Datei, um die ich mir Sorgen mache, ist die Datei show.version und ein paar Zeilen Information. Für "cver" möchte ich die Boot-Informationen des JUNOS Base OS. Für "cmod" möchte ich die Informationen für Model. Das "X" greift dann auf verschiedene Geräteoptionen wie -b = "bb" (device.bb.domain.net)

Unten ist ein Beispiel für die Datei show.version.

Hostname: device-r0 
Model: ex3300-24t 
JUNOS Base OS boot [12.3R7.7] 
JUNOS Base OS Software Suite [12.3R7.7] 
JUNOS Kernel Software Suite [12.3R7.7] 
JUNOS Crypto Software Suite [12.3R7.7] 
JUNOS Online Documentation [12.3R7.7] 
JUNOS Enterprise Software Suite [12.3R7.7] 
JUNOS Packet Forwarding Engine Enterprise Software Suite [12.3R7.7] 
JUNOS Routing Software Suite [12.3R7.7] 
JUNOS Web Management [12.3R7.7] 
JUNOS FIPS mode utilities [12.3R7.7] 

Ich habe versucht, diese letzten paar Tage für jede Art von Beispielen zu suchen, die ähnlich sein würden und kam zu kurz. Ich sah eine Antwort, die die Awk-Pipe sagte, aber es druckt nur die zweite Awk-Info.

Ich versuchte dann & & das awk anstatt es zu leiten, und es brachte mich näher, aber druckt das erste awk dann das zweite awk auf unterschiedlichen Linien und ich will sie kombiniert haben.

& & Beispiel:

cver() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
("-h"|help) echo "'cver' allows us to see the software version 
running on all Company Juniper devices.\n'cver' is especially helpful 
in determining which devices require a software upgrade.\n\nOptions 
are -b for bb, -c for cpe, -e for etech, -k for core, and -o for 
ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep 
name";; 
(*) echo "Unrecognized or incomplete command.\nUse -h for help.";; 
    esac 
[ $X ] && awk -vSRCH="$3" '/JUNOS/ && /boot/ && $5 ~ "^[[]" SRCH 
{sub ("/show.version", "", FILENAME); sub (".*/", "", FILENAME); 
print $5 " " FILENAME}' ~/svn/nw_config_data/*${X}.domain.net/show.version 
| sort && awk '/Model/ {sub ("/show.version", "", FILENAME); 
sub (".*/", "", FILENAME); print $2}' 
~/svn/nw_config_data/*${X}.domain.net/show.version | sort 

Input/Output Beispiel:

% cver -k <---input 
[11.4R10.3] device.core.domain.net <---output 
mx480 <---output 

ich die Eingabe/Ausgabe sein wollen:

% cver -k <---input 
device.core.domain.net mx480 [11.4R10.3] <---output 

Was ich den Druck Teil vorstellen, von Der Befehl sieht wie folgt aus:

print FILENAME " " $2 " " $5 

Ich habe auch versucht, das Hinzufügen/Model/& & $ 2 auf meine erste Funktion, aber es macht mir keine Ausgabe geben, und ich bin gerade an dieser Stelle verloren.

Beispiel:

cver() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
("-h"|help) echo "'cver' allows us to see the software version 
running on all Company Juniper devices.\n'cver' is especially helpful 
in determining which devices require a software upgrade.\n\nOptions 
are -b for bb, -c for cpe, -e for etech, -k for core, and -o for 
ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep 
name";; 
(*) echo "Unrecognized or incomplete command.\nUse -h for help.";; 
    esac 
[ $X ] && awk -vSRCH="$3" '/JUNOS/ && /boot/ && $5 && /Model/ && $2 ~ "^[[]" SRCH 
{sub ("/show.version", "", FILENAME); sub (".*/", "", FILENAME); 
print FILENAME " " $2 " " $5}' ~/svn/nw_config_data/*${X}.domain.net/show.version | sort 
+0

Ich vermute, dass Sie eher eine Antwort erhalten würden, wenn Sie eine geeignete Stichprobe Ihrer Eingabedaten gezeigt hätten ... und dann, getrennt, welchen Aspekt davon Sie zu extrahieren versuchen. –

+0

Ich werde die Frage bearbeiten, um weitere Informationen anzuzeigen. Vielen Dank. – rewalker3

+0

Bearbeitungen sind jetzt vorhanden. Hoffentlich hilft das. – rewalker3

Antwort

0

Ich war zufällig gerade zu erwähnen Skript an einen Kollegen und erfuhr, dass er Programmiererfahrung hat. Er entschied sich dafür, einen Blick darauf zu werfen, was miken32 zur Verfügung gestellt hatte und entwickelte ein funktionierendes Skript, das genau das macht, wonach ich gesucht habe.

Jetzt planen wir, dieses Skript in naher Zukunft zu erweitern, um mehr Informationen genau zu ziehen, da Juniper ihre show.version-Informationen nicht über Softwareversionen standardisiert und die benötigten Informationen aus der Einige Cisco-Geräte, die wir in diesem Bereich eingesetzt haben, da dieses Skript auf Juniper basiert.

Wir haben eine "-a" -Option hinzugefügt, um ALLE Hosts zu ziehen. Der Verzeichnis-Bereich erlaubt es uns, alle Hosts für die gewählte Option zu sehen (-b, -c, -e, etc.), und öffnet sie in einer for-Schleife, um zu verhindern, dass doppelte Informationen eingefügt werden. Ich werde die Hilfe und (*) Optionen aus dem alten Cver später hinzufügen.

Der Zweck meines ursprünglichen cver-Skripts bestand darin, Softwareversionen aller unserer Geräte zu erstellen, damit wir mit der Planung von Wartungsfenstern zur Aktualisierung der Juniper-Software beginnen konnten. Dann entschied ich, dass es schön wäre, das Modell auch zu sehen, also schrieb ich das cmod-Skript, um das Modell zu bekommen. Wir benötigten diese Informationen, da einige Modelle einen Fehler im Software-Upgrade-Prozess (mx80) aufweisen, der einen vorzeitigen Neustart erfordert, bevor die Software geladen wird.

Dieses Skript eignet sich hervorragend für jeden, der bei einem ISP oder sogar einer Unternehmensumgebung mit zahlreichen eingesetzten Routern und Switches arbeitet. Jetzt können Sie die Informationen auf diesen Geräten schnell abrufen, ohne sich bei jedem Gerät anmelden zu müssen und Befehle manuell ausführen zu müssen, um diese Informationen zu erhalten.

Und jetzt, die neue und verbesserte cver!

#!/usr/local/bin/zsh 
svn="$HOME/svn/nw_config_data/" 
case "$1" in 
    ("-a") 
    hosts="" 
    ;; 
    ("-b") 
    hosts=".bb.domain.net" 
    ;; 
    ("-c") 
    hosts=".cpe.domain.net" 
    ;; 
    ("-e") 
    hosts=".etech.domain.net" 
    ;; 
    ("-k") 
    hosts=".core.domain.net" 
    ;; 
    ("-o") 
    hosts=".ohgov.domain.net" 
    ;; 
esac 

dirs=($(ls -d $svn*$hosts*)) 
for hostdir in $dirs 
do 
host=$(echo $hostdir | grep -Eo "(\w|\.|-)*$") 

awk -v h=$host '/^JUNOS Base OS boot/{v=$5} /^Junos:/{v="["$2"]"} /^Model/{m=$2} END{if(m!="number"){printf("%s %s %s\n",h,m,v)}}' "$hostdir/show.version" 
done 
1

Ihr awk Code ist sehr kompliziert; Ich habe es hier deutlich verkürzt, was hoffentlich leichter für Sie (und andere) zu verstehen ist!

Die /PATTERN/{STATEMENT} Linien bewerten EXPRESSION, wenn PATTERN übereinstimmt. Es ist also sehr einfach, eine Variable anhand dieser Kriterien zuzuweisen. Dann im END Block drucken wir die Informationen, die wir gesammelt haben (und nicht mit dem Dateinamen durcheinander, geben Sie einfach die gewünschten Informationen direkt mit dem -v Flag eine Variable zu setzen.)

#!/bin/zsh 

cver() { 
    svn="$HOME/svn/nw_config_data" 
    case "$1" in 
     ("-b") 
      host="bb.domain.net" 
      ;; 
     ("-c") 
      host="cpe.domain.net" 
      ;; 
     ("-e") 
      host="etech.domain.net" 
      ;; 
     ("-k") 
      host="core.domain.net" 
      ;; 
     ("-o") 
      host="ohgov.domain.net" 
      ;; 
     ("-h"|help) 
      echo "'cver' allows us to see the software version running on all Company Juniper devices.\n'cver' is especially helpful in determining which devices require a software upgrade.\n\nOptions are -b for bb, -c for cpe, -e for etech, -k for core, and -o for ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep name\n" 
      exit 0 
      ;; 
     (*) 
      echo "Unrecognized or incomplete command.\nUse -h for help.\n" 
      exit 2 
      ;; 
    esac 
    awk -v "h=$host" '/^JUNOS Base OS boot/{v=$5} /^Model/{m=$2} END{printf("%s %s %s\n",h,m,v)}' "$svn/$host/show.version" 
} 
+0

Diese Antwort war knapp, außer dass sie nicht alle meine Bedürfnisse befriedigen konnte. 1) Ich konnte den Host nicht mit Platzhaltern suchen, also habe ich das geändert, indem ich "*" zu "$ svn /" * "$ host/show.version" hinzugefügt habe. Das würde dann keine Hostnamen anzeigen, also habe ich einen/^ Hostname/Suche hinzugefügt. Schließlich druckte dieses Skript nur die letzte Zeile des Hosts, den ich suchte. Wenn ich END lösche, würde es einfach alles drucken, egal welcher Host, und es würde die gewünschte Information so oft drucken, wie Zeilen in der Datei show.version vorhanden sind. Das hat die Antwort jedoch inspiriert, also danke! – rewalker3

Verwandte Themen