Problem mit awk und Variable

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von onlineuser, 05.05.2006.

  1. #1 onlineuser, 05.05.2006
    onlineuser

    onlineuser Mitglied

    Dabei seit:
    05.05.2006
    Beiträge:
    34
    Zustimmungen:
    0
    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.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    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
     
  4. #3 Wolfgang, 06.05.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  5. #4 onlineuser, 07.05.2006
    Zuletzt bearbeitet: 07.05.2006
    onlineuser

    onlineuser Mitglied

    Dabei seit:
    05.05.2006
    Beiträge:
    34
    Zustimmungen:
    0
    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.
     
  6. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Code:
    rx=$(ifconfig $interface | awk '/rx/' | cut ...
    
    Gruss, Xanti
     
Thema:

Problem mit awk und Variable

Die Seite wird geladen...

Problem mit awk und Variable - Ähnliche Themen

  1. Script Datumsproblem Variablen durcheinander??

    Script Datumsproblem Variablen durcheinander??: Hallo zusammen habe ein kleines Backupsript welches täglich nachts um 23.50 Uhr einge Dump erstellt und per sftp auf einen Sicherungsserver...
  2. Variablen und Ersetzungsproblem in Bash

    Variablen und Ersetzungsproblem in Bash: Moin, ich hab da ein Problem, an dem ich seit Tagen sitze und keine Lösung finde. Vielleicht kann einer von euch da helfen. Angenommen ich...
  3. Probleme mit variable

    Probleme mit variable: hi eine Dumme Frage mit diesem befehl cat $datroh | awk -F"," '{for (I=1; I<NF; I++) print $I;}' >...
  4. Variablen in Cronjob = Problem?

    Variablen in Cronjob = Problem?: Hallo! Ich nutze als Betriebssystem Solaris 8 auf ner Sun. Habe mir da ein Backup-Script geschrieben, was auch wunderbar funktioniert. Nun...
  5. mysqldump script -> Variablen Problem

    mysqldump script -> Variablen Problem: Folgendes Script : #!/bin/sh #------------------------------------------------------------------------------ #Overall...