Problem mit awk und Variable

O

onlineuser

Mitglied
Hallo,

habe ein kleines Problem.

Code:
ifconfig:
Schreiben Sie ein Shellskript, das eine Tabelle mit folgenden Angaben pro Zeile für jedes Netzwerkinterface ausgibt:
devicename gesendete_pakete gesendete_bytes empfangene_pakete empfangene_bytes

Dachte nun, dass ich die Anzahl der Interfaces auslese und dann mit einer For-Schleife die Daten zusammensuche.


Code:
devices=$(ifconfig -s |awk '{ print }' | wc -l)
for ((i=2;$i<$devices+1;i++))                              #erste Zeile von ifconfig -s soll weggelassen werden

echo $i               #funktioniert
ifconfig -s | awk ' NR == $(i) { print }'                    #soll Zeile i ausgeben, aber $i nimmt er nicht

done

Welche Syntax muss $i haben, damit es in dieser Zeile akzeptiert wird?

Ist meine Vorgehensweise, zuerst die Anzahl der Interfaces auszulesen und dann von jedem die Daten zusammenzuholen mit awk und grep gut?

Die Outputsprache dachte ich mir, erzwinge ich in englisch, damit grep und awk immer einen Treffer bekommt.

Liebe Grüsse.
 
Den -s Schalter gibts bei mir nicht. Deswegen kann ich nur vage Tipps geben. Shellvariablen übergibt man an awk z.B. mittels:

Code:
... awk ' NR == i { print }' i="$i" ...

btw: in der ersten Zeile sehe ich einen useless use of awk...

Gruss, Xanti
 
Hallo

Hab da mal was mit sed gebastelt, was du natürlich noch anpassen musst.
Die englische Ausgabe hängt von deiner Locale ab.

Code:
ifconfig|sed -ne '/^$/!H;/^$/{x;s/^\([^ ]*\) .*RX packets:\([^ ]*\).*TX packets:\([^ ]*\).* RX bytes:\([^ ]*\) .* TX bytes:\([^ ]*\) .*$/\1\tErhalten\tGesendet\nPakete\t\2\t\3\nBytes\t\4\t\5\n/g;p}'

Hier mach ich mir zunutze, dass ifconfig die Geräte durch Leerzeilen trennt. -> meines tut das jedenfalls.

Alles was keine Leerzeile ist wird in den Hold geschoben.
/^$/!H;
Kommt eine Leerzeile tausch ich pattern mit hold - Pattern ist dann ja leer.

Lösche die Leerzeile am Anfang, und manipulier dann mit s die Zeile wie ich sie brauche.

Sed kann gut multiline, auch wenn es etwas kaputt aussieht.

Gruß Wolfgang
 
Hi,

Danke für die awk-Syntax!

Ich hab das Auslesen mal so gelöst, jedoch stehen die empfangenen und gesendeten Bytes nicht immer in Zeile 8. Beim sit01 (IPv6 to IPv4) steht die relevante Zeile in Zeile 5. Problem schon gelöst! gg

Code:
#!/bin/bash
clear
echo "Aufgabe 2.1"
devices=$(ifconfig -s | awk '{ print }' | wc -l)						#zaehlt Anzahl der Interfaces
for ((i=2;$i<$devices+1;i++))									#gibt alle Zeilen von ifconfig -s ausser der ersten aus
do
  #ifconfig -s | awk ' NR == i { print $1 " - " $8 " - " $4 }' i="$i"
  interface=$(ifconfig -s | awk ' NR == i { print $1 }' i="$i")					#liest jeweiligen Interfacenamen aus
  rx=$(ifconfig $interface | awk 'NR == 8 { print }' | cut -d ":" -f2 | cut -d " " -f1)		#liest RX-Pakete aus
  tx=$(ifconfig $interface | awk 'NR == 8 { print }' | cut -d ":" -f3 | cut -d " " -f1)		#liest TX-Pakete aus
  ifconfig -s | awk ' NR == i { print "Interface: " $1 "\tgesendete Pakete: " $8 "\tgesendete Bytes: " tx "\tempfangene Pakete: " $4 "\tempfangene Bytes: " rx}' i="$i" rx="$rx" tx="$tx"
done

Wie kann ich der Variable rx und tx im awk beim parameter NR sagen, dass er nach der Zeile greppen soll, wo RX vorkommt, damit er mir da immer die richtige Zeile herausnimmt!?

PS: Der Einzeiler ist interessant, wollte es aber erstmal so auf die Reihe bringen! gg

Liebe Grüsse.
 
Zuletzt bearbeitet:
Code:
rx=$(ifconfig $interface | awk '/rx/' | cut ...

Gruss, Xanti
 

Ähnliche Themen

Nagiosgrapher erkennt Werte nicht

sed im script per crontab

MCP61 chipset Nvidia driver installation

wpa_supplicant Problem gentoo

Textkonsole mit KMS zu klein

Zurück
Oben