2016-06-08 2 views
2

I einen Shell-Skript, die Informationen von vservers extrahiert, dann ist dies das Skript:Tabelle Formatierungs Shell-Skript

for i in {130..136}; do 
> ./vserver/Info$i 
ssh 132.138.180.$i "hostname; 
echo 'Virtual' 
echo '' 
cat /etc/issue | head -1 
echo '' 
dmidecode | grep Socket | tail -1 | awk '{print \$4}' 
echo '' 
free -g | grep Mem | awk '{ print \$2 }' 
echo '' 
fdisk -l | grep Disk | wc -l 
echo '' 
df -h | grep ^/ | wc -l 
echo '' 
ifconfig | grep inet | awk '{print \$2 }' | cut -c 6- | awk '\$1=\$1' ORS=' ' 
echo '' 
ifconfig | grep -b1 inet | grep HWaddr | awk '{ print \$5 }' | awk '\$1=\$1' ORS=' ' 
echo '' 
ip route show | grep default | awk '{ print \$3 }' | awk '\$1=\$1' ORS=' ' 
echo '' 
cat /etc/resolv.conf | grep name | awk '{ print \$2 }' | awk '\$1=\$1' ORS=' ' 
echo '' 
mount | grep el01 | awk '{ print \$1 \" -> \" \$3 }' | awk '\$1=\$1' ORS=' ' 
echo '' 
netstat -nr | awk '{ print \$1, \$2, \$3, \$8 }' 
echo '' 
" >> ./vserver/Info$i 
done 

Ich habe folgenden Ausgang (Beispiel):

el01test 
Virtual 

Oracle Linux Server 

2 

7 

1 

2 

19.16.10.111 12.1.0.1 12.1.0.11 12.1.2.11 127.0.0.1 
00:22:4F:F9:3C:D8 80:22:05:F7:FE:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00 22:44:22:F4:FE:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00 22:44:22:E2:FE:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00 
19.16.10.1 
19.16.10.12 19.16.10.15 
el01:/export/el011->/home/glassfish/glassfish el01:/export/logs/el01vur01->/home/glassfish/logs el01:/export/home/oem12ag/age->/home/oem12ag/agent 
Kernel IP routing 
Destination Gateway Genmask Iface 
0.0.0.0 192.168.181.1 0.0.0.0 bond0 
169.254.0.0 0.0.0.0 255.255.0.0 bond1 
17.1.0.0 0.0.0.0 255.255.0.0 bond2 
17.1.0.0 0.0.0.0 255.255.0.0 bond1 
19.16.0.0 0.0.0.0 255.255.252.0 bond3 
19.16.10.0 0.0.0.0 255.255.252.0 bond0 

Ich mag würde Formatiere meine Informationen wie folgt:

Ich habe versucht mit awk, aber ich hatte nicht viel Glück damit. Danke für Ihre Hilfe!

+0

Haben Sie wirklich leere Zeilen zwischen Ihren Feldern oder ist das nur ein Formatierungsproblem? Sie können den Code um vier Leerzeichen einrücken, um die Formatierung beizubehalten. –

+0

@josseossa Ich habe etwas Formatierung für dich hinzugefügt. Wenn das nicht stimmt, bearbeiten Sie Ihre Frage, um sie zu beheben. –

+0

Hallo, Ja Benjamin, es gibt leere Zeilen als Feldtrennzeichen, aber ich kann sie bei Bedarf löschen, tatsächlich gibt es eine Reihe von virtuellen Servern, die ich brauche, um einige Informationen zu erhalten, und dies ist ein Beispiel für die Skriptausgabe. Ich muss es wie gezeigt am Tisch formatieren. Dank Glenn für die Formatierung, das ist eigentlich mein erster Beitrag hier und wusste nicht heiß, das zu tun. – josseossa

Antwort

0

ich endlich meine Formatierung Skript zu beenden, dank Ihnen allen für Ihre Hilfe, hatte schließlich y das anfängliche Skript zu ändern und formatieren Sie den nächsten Code verwendet:

for q in $(ls); do awk ' NR >= 19 { route[ j++ ] = $0; next } NF==1 { info[ i++ ] = $1; next } NR == 4 { OS= $0 } NR == 14 { A=split($0, Ip, " "); next } NR == 15 { B=split($0, Mac, " "); next } NR == 17 { C=split($0, Dns, " "); next } NR == 18 { D=split($0, Mount, " "); next } END { if (A > B) max1=A ; else max1=B; if (C > D) max2=C; else max2=D; if (max1 > max2) max=max1; else max=max2; if (max < j) max=j; for (i=0; i<=6; i++) {printf "%s\t ",info[i]} ; for (w = 0; w <= max; w = w+1) { printf("\t\t\t\t\t\t\t%s\t%s\t%s\t%s\t%s\n",Ip[w], Mac[w], Dns[w], Mount[w], route[w]) } } ' $q; done > Fullout 

Vielen Dank für Ihre Hilfe ! Wenn vielleicht jemand weiß, wie man den printf mischt, damit er in derselben Zeile drucken kann, würde ich mich freuen. Ich bin mir auch bewusst, dass der Code optimiert werden konnte, aber ich war in Eile, sorry :(. Ich schrieb eine der Ausgabe des ersten Skript in der ersten Antwort, wenn jemand es für Ihre weitere Skripterstellung testen möchte. dank

2

Sie können es mit awk tun, indem Sie die Zeilen in ein Array einlesen. Dann geben Sie die Zeilen mit den Informationen in das gewünschte Tabellenformat aus.

Hier ist ein Beispiel, das Ihnen die grobe Vorstellung zu geben:

script.awk

{ info[ i++ ] = $1 } 
END { printf("%s\t%s\t%s\t%s\t%s\n", info[0], info[3], info[5], info[7], info[9]) 
     printf("\t\t\t\t\t\t\t%s\n", info[10]) 
     printf("\t\t\t\t\t\t\t%s\n", info[11]) 
    } 

es wie folgt verwendet: awk -f script.awk yourfile.

+0

Ok, ich habe es. In diesem Fall sollten wir das Trennzeichen als RS verwenden = FS = "\ n", richtig? – josseossa

+0

Hallo @Lars Fischer, ich lese deine Antwort, aber vielleicht ist es nicht ganz genau, wie ich zuerst dachte, weil ich in einigen Ausgaben 3 IP haben konnte und in anderen konnte ich 4 haben, also konnte ich es nicht manuell arrangieren, wie vorgeschlagen – josseossa

+1

@josseossa Für den Fall einer vierten IP fügen Sie einfach 'if (info [12]) printf (" \ t \ t \ t \ t \ t \ t% s \ n ", Info [12])' nach dem dritten Druck hinzu . –

Verwandte Themen