Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
awk zeile spalte auslesen?

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
eddy
Gast





BeitragVerfasst am: 20. Sep 2002 9:20   Titel: awk zeile spalte auslesen?

Hi, ich moechte mittels awk aus einem .csv file eine bestimmte Spalte aus einer bestimmten Zeile auslesen.
Die Spalte kann ich schon mit

VAR=`awk -F ";" '{print $3}' datei`

auslesen.

Wie aber baue ich dort jetzt die Zeile ein??? Ich brauche also noch eine VAR für die Zeile.
Ich loese das z.Z mit einem umständlichen grep.


Hoffe auf antworten

Gruß Eddy.
 

namina
Gast





BeitragVerfasst am: 20. Sep 2002 14:42   Titel: Re: awk zeile spalte auslesen?

Willst du eine bestimmte Zeile auslesen, oder eine Zeile die eine bestimmte Zeichenfolge enthält?
 

JOchen
Gast





BeitragVerfasst am: 20. Sep 2002 17:46   Titel: Re: awk zeile spalte auslesen?

Einfach eine Auswahlbedingung vor die awk-Aktion setzen:
code:


# Zeilennummer
VAR=`awk -F";" 'NR == 10 { print $3}' datei`

# Regulärer Ausdruck
VAR=`awk -F";" '/treffer/ { print $3}' datei`




Die erste Variante trifft auch Zeile 10, die zweite auf jede Zeile, in der "treffer" steht.

Jochen
 

Eddy
Gast





BeitragVerfasst am: 23. Sep 2002 13:11   Titel: Re: awk zeile spalte auslesen?

Hallo Jochen, das klappt schon sehr gut mit awk. Ich habe in der csv Datei am Anfang eine Sequenznr.

seq-001;xxxxx;xxxxx;xxxx

usw...

so die seq-nr. liegt am Anfang bei 1 also NR=1 seq-$NR

jetzt steigere ich die seq-$NR mit expr $NR + 1

Dort liegt ein weiteres Prob. wenn ich awk nach seq-1 mache gibt er mir auch seq-11 .. etc aus also muss die seq-$NR seq-001 heissen. Wie bringe ich expr bei das 1 + 1 = 002 ist und nicht 2 ???

Gruß Eddy.
 

Jochen
Gast





BeitragVerfasst am: 23. Sep 2002 13:48   Titel: Re: awk zeile spalte auslesen?

expr am besten gar nicht; wenn Du unter Linux arbeitest, verwende statt dessen die bash (oder die ksh, wenn Du unter einer anderen UNIX-Variante arbeitest) und verwende zum Rechnen (( )). So wird aus

Z=`expr $Z + 1`

einfach ein

(( Z = Z + 1 ))

Das beschleunigt die meisten Skripte deutlich, da für jedes expr ein eigener Prozess erzeugt und wieder abgerissen werden muss. In der zweiten Variante rechnet die Shell intern.

Wenn nun das erste Feld ($1) für Satz NR immer gleich "seq-NR" (mit NR 3stellig mit 0 aufgefüllt), dann mach doch so was:
code:
awk -F";" -v zeile=$SEQUENZNUMMER 'NR == zeile { print $3 }' datei
Mit der gewünschten Zeilennummer in SEQUENZNUMMER.

Aber: Beschreibe doch jetzt mal besser, was Du wirklich machen willst. Wenn Du über alle Zeilen der Datei etwas machen willst (wie Du es mit einem Zähler, den Du immer um eins hochrechnest und der dabei die Zeilennummer sein soll, implizierst), dann hast Du eine komplexe und langsame Herangehensweise. Bei 1000 Zeilen in der Datei muss Dein Skript nämlich auch 1000mal die ganze Datei durchackern - ziemlich suboptimal. Entweder man verbleibt dann ganz im awk oder bearbeitet die Eingabedatei zeilenweise in der Shell. Aber dieses Mischmasch garantiert eine miese Performance.

Und ansonsten ist für eine formatierte Ausgabe ("1" -> "001") in der Shell das (shell-externe) Kommando printf zuständig.

Jochen
 

Eddy
Gast





BeitragVerfasst am: 24. Sep 2002 10:13   Titel: Re: awk zeile spalte auslesen?

HI Jochen!

Ich brauchte dieses Wissen um ein Skript zu schreiben das die Konnetktivitaet der Hosts die in einem .csv FILE gespeichert sind, testet. Ich bin gerade dabei eine Samlung von Skripten zur Netzwermesung zu schreiben.Das erste Skript hoststatus.sh ist nun fertig

Hier das Skript

Das Skript ist von folgender relativer Pfadstruktur abhaengig

Sycsys/
/data/input/$FILENAME.csv # input
/data/ouput/$FILENAME.csv # output
/modules/hoststatus.sh # Skripte
/monitors/monitor.tcl # GUI fuer output csv FILE

Diese verzeichnisstruktur muss eingehalten werden, oder die Pfade muessen in dem Skript angepasst werden.
im Verz Sycsys/monitors wird in Zukunft ein TCL/TK Skript zu Visualisierung der Daten sein.

Nun das erste Skript um die Konnektivitaet mit ping zu testen:


#! /bin/sh
#
# Konnektivitaetstest
#

#! /bin/sh

HOST=1
SEQUENZ=2

while [ $HOST -le 254 ]; do

HOSTIP=$(awk -F ";" -v zeile=$SEQUENZ 'NR == zeile { print $4 }' data/input/ip_table.csv)

ping -c 1 -w 1 $HOSTIP
STATUS=$(echo $?)

((SEQUENZ = SEQUENZ + 1))

if [ "$STATUS" = "0" ]
then
echo $(awk -F ";" -v zeile=$SEQUENZ 'NR == zeile' data/input/ip_table.csv)';aktiv' >> data/output/ip_table_status.csv
else
echo $(awk -F ";" -v zeile=$SEQUENZ 'NR == zeile' data/input/ip_table.csv)';deaktiv' >> data/output/ip_table_status.csv
fi
done


# Das dazugehoerige $input.csv FILE sieht dann so aus:

Ausschitt
FIRMA;STANDOR;DOMAIN;IP_ADRESSE
FIRMA X;Berlin;Firma.de;192.168.12.1
FIRMA X;Berlin;Firma.de;192.168.12.2
FIRMA X;Berlin;Firma.de;192.168.12.3
FIRMA X;Berlin;Firma.de;192.168.12.4
FIRMA X;Berlin;Firma.de;192.168.12.5
FIRMA X;Berlin;Firma.de;192.168.12.6
FIRMA X;Berlin;Firma.de;192.168.12.7
FIRMA X;Berlin;Firma.de;192.168.12.8
FIRMA X;Berlin;Firma.de;192.168.12.9
FIRMA X;Berlin;Firma.de;192.168.12.10
FIRMA X;Berlin;Firma.de;192.168.12.11
FIRMA X;Berlin;Firma.de;192.168.12.12
FIRMA X;Berlin;Firma.de;192.168.12.13

Das Output File hat eine zusaetzliche Spalte wodrin steht aktiv oder deaktiv zu auswertung.

FIRMA X;Berlin;Firma.de;192.168.12.2;aktiv
FIRMA X;Berlin;Firma.de;192.168.12.3;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.4;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.5;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.6;aktiv
FIRMA X;Berlin;Firma.de;192.168.12.7;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.8;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.9;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.10;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.11;deaktiv
FIRMA X;Berlin;Firma.de;192.168.12.12;aktiv
FIRMA X;Berlin;Firma.de;192.168.12.13;deaktiv

Vielen Dank nochmal!
Als naechstes wird das bandbreite.sh Skript geschrieben. Das basiert dann auf bing

Gruss Eddy
 

Jochen
Gast





BeitragVerfasst am: 24. Sep 2002 10:55   Titel: Re: awk zeile spalte auslesen?

Hmm, ein paar Anmerkungen habe ich schon dazu, aber momentan nicht viel Zeit. Nur so viel jetzt eben:

  • Die while-Schleife fragt die Variable HOST ab. Diese wird m.E. mit 1 initialisiert und nie wieder verändert. Konsequenz: Endlos-Schleife.
  • Für jeden Eintrag wird die Eingabedatei zweimal vollständig durchgelesen, bei 100 Hosts also 100 * 100 * 2 = 20000 Zeilen. Das skaliert nicht wirklich gut...

    Jochen
  •  

    eddy
    Gast





    BeitragVerfasst am: 24. Sep 2002 12:34   Titel: Re: awk zeile spalte auslesen?

    Hmm.. ja da muss noch eine break Anweisung oder so rein damit ab 254 ein Break kommt.

    Du sprichst da die performance an? Wie koennte man die verbessern?
    Bin leider noch Anfaenger in awk.

    Gruss Eddy
     

    Jochen
    Gast





    BeitragVerfasst am: 25. Sep 2002 12:05   Titel: Re: awk zeile spalte auslesen?

    Prinzipiell gilt: Für jede Zeile willst Du die IP-Adresse anpingen und die Zeile plus Angabe, ob der angepingte Rechner erreicht werden konnte, wieder ausgeben. Warum dann irgendwelche Schleifenbedingungen basteln, die konkret mit der Aufgabenstellung nichts zu tun haben? Ich würde so vorgehen:
    code:

    #!/bin/bash

    awk '
    BEGIN { FS=";" ; OFS=";" }

    /^[ \t]*#/ { next }

    /^[ \t]*$/ { next }

    {
    exitcode = system ("ping -c 1 -w 1 " $4 " >/dev/null 2>&1")
    if (ec == 0) {
    ausgabe = "aktiv"
    } else {
    ausgabe = "offline"
    }
    print $0,ausgabe
    }' $1 > $2

    exit $?


    Der BEGIN-Block setzt den Feldtrenner für Eingabe (FS) und Ausgabe (OFS) auf Semikolon. Der 2. und 3. Block überlesen Kommentar- und Leerzeilen. Der vierte ruft pro Zeile ping mit den gewünschten Parametern auf, setzt die Ausgabe entsprechend dem Rückgabewert und gibt die Zeile aus. Als Parameter erwartet das Skript 2 Argumente: Arg 1 ist die Eingabedatei, Arg 2 ist die Ausgabedatei (die nicht gleich der Eingabedatei sein darf).

    Jede Zeile wird nur einmal gelesen, macht 100 gelesene Zeilen bei 100 Rechnern (zuzüglich Kommentare/Leerzeilen). Gegenüber den 20000 gelesenen Zeilen bei Deiner Lösung ein Fortschritt, vom Verlust fragwürdiger Schleifenkonstruktionen ganz zu schweigen.

    Jochen
     

    Eddy
    Gast





    BeitragVerfasst am: 26. Sep 2002 11:04   Titel: Re: awk zeile spalte auslesen?

    HI Jochen!

    Das ist wirklich eleganter Code
    Ich werde ihn ausprobieren!! Danke!

    Ich habe meine Code auch nochmla angepasst, aber es laueft wirklich langsam.

    #! /bin/sh
    #
    # Konnektivitaetstest
    # Netzwerkstatus - zeigt Status von Hosts an. Activ/Deactiv
    #
    #! /bin/sh

    DATEINAME=$1
    SEQUENZ=1

    if test -s data/output/$DATEINAME
    then
    rm -f data/output/$DATEINAME
    fi

    while [ $SEQUENZ -le 256 ]; do

    if [ $SEQUENZ = 256 ]
    then
    break
    fi

    HOSTIP=$(awk -F ";" -v zeile=$SEQUENZ 'NR == zeile { print $4 }' data/input/$DATEINAME)

    ping -c 1 -w 1 $HOSTIP
    STATUS=$(echo $?)

    ((SEQUENZ = SEQUENZ + 1))


    if [ "$STATUS" = "0" ]
    then
    echo $(awk -F ";" -v zeile=$SEQUENZ 'NR == zeile' data/input/$DATEINAME)';aktiv' >> data/output/$DATEINAME
    else
    echo $(awk -F ";" -v zeile=$SEQUENZ 'NR == zeile' data/input/$DATEINAME)';deaktiv' >> data/output/$DATEINAME
    fi

    done

    Ist nicht die eleganteste Loesung, aber Funkt jetzt. Aber ich werde warscheinlich auf deinem Code umsteigen

    Ok, bis denne, Eddy.
     

    Jochen
    Gast





    BeitragVerfasst am: 26. Sep 2002 12:25   Titel: Re: awk zeile spalte auslesen?

    An einer gewissen Langsamkeit wirst Du nicht vorbeikommen: Wenn ping keine Antwort erhält, ist der Timeout ja bei einer Sekunde (-w 1). Wenn also von 100 Rechnern 60 aus sind, braucht das Skript mind. 60 Sek. Zeit, plus Ausführungszeit natürlich.

    Die Kritik mit der Schleifenbedingung war, dass Du eine Variable HOST abfragtest, deren Wert Du nie mehr verändertest, womit Du eine Endlosschleife prodiziert hattest. Wenn Du nun $SEQUENZ als Schleifenvariable verwendest, brauchst Du kein "if/then break", weil die Bedingung im Schleifenkopf irgendwann einmal den Abbruch der Schleife veranlassen wird. Schliesslich wird SEQUENZ innerhalb des Schleifenkörpers verändert "(( SEQUENZ = SEQUENZ + 1 ))". Also streich das "if [ $SEQUENZ = 256 ] ... " ersatzlos. Wenn Du übrigens in der bash programmierst, kannst Du auch die numerischen Vergleiche lesbarer schreiben:
    code:
    while (( SEQUENZ < 255 )) ; do
    Deine Fassung ist allerdings portabler, wenn man auf einer anderen Maschine weder bash noch ksh zur Verfügung hat.

    Jochen
     

    Eddy
    Gast





    BeitragVerfasst am: 27. Sep 2002 11:31   Titel: Re: awk zeile spalte auslesen?

    Hi Jochen, wie gehts?

    Danke nochmal das du mir geholfen hast. Woher kommst du eigentlich?
    Ich komme aus Berlin und bin fast fertig mit meiner Ausbildung zum IT-Systemelektroniker.

    ein Skript hat noch einen kleinen fehler undzwar bei exitcode = system ...

    und bei der if bedingung heist die var aufeinmal ec wennbeide Var gleich heißen funkt es echt super!

    Vorallem ist in deinem Skript keine Zeilenabhaengigkeit vorhanden. Also if HOST$ < 255.

    Das .csv File kann jetzt beliebig viele Zeilen haben. Sehr gut.


    Gruß Eddy.




    #!/bin/bash

    awk '
    BEGIN { FS=";" ; OFS=";" }

    /^[ \t]*#/ { next }

    /^[ \t]*$/ { next }

    {
    ec = system ("ping -c 1 -w 1 " $4 " >/dev/null 2>&1")
    if (ec == 0) {
    ausgabe = "aktiv"
    } else {
    ausgabe = "offline"
    }
    print $0,ausgabe
    }' $1 > $2

    exit $?
     

    Jochen
    Gast





    BeitragVerfasst am: 27. Sep 2002 12:05   Titel: Re: awk zeile spalte auslesen?

    exitcode? ec?

    *scroll*
    *nachles*
    *rotwerd*

    Mist... Sowas kommt davon, wenn man an einem Rechner probiert und dann nicht mittel Cut'n'Paste auf einen 2. Rechner pappen kann, sondern alles neu eintippen muss. Na ja, hast den Fehler ja entdeckt. (Hätte besser sagen sollen, dass ich Dich nur testen wollte... ) Schön, dass es Dir geholfen hat.

    Gebürtig bin ich Düsseldorfer (da arbeite ich auch als SysAdmin), wohne aber seit ein paar Jahren in Jülich - ganz im Westen, ca. 600 km von Berlin entfernt.

    Jochen
     

    Eddy
    Gast





    BeitragVerfasst am: 27. Sep 2002 12:28   Titel: Re: awk zeile spalte auslesen?

    OK, danke nochmal!

    Ich habe da aber noch ein prob?

    wie kann ich den Millisekundenwert den ping ausgibt in eine VAR speichern?

    Stellen Die Kommandos allgemein ihre Ergebnisse (Ausgaben, Werte) eigentlich auch zur Weiterverarbeitung dem User in einer VAR bereit, die man auslesen kann?

    Eddy
     

    Eddy
    Gast





    BeitragVerfasst am: 30. Sep 2002 10:13   Titel: Re: awk zeile spalte auslesen?

    Hi, einen schoenen Montag Morgen!

    Ich habe da noch ein Prob mit dem Skript.

    Volgendes:

    Dein skript funkkt soweit sehr gut. Nur will ich die Antwortzeit des pings in eine Var speichern. Ich wuste nicht genau wie das geht, ich habe einfach ein wenig die Ausgabe von Ping gefiltert und es funktioniert. Folgende befehlszeile wollte ich nun in das awk Skript einbauen, aber das klappt nicht. Ich habe schon ein wenig rumexperimentiert, aber es haut noch nicht hin.

    ping -w 1 -c 1 192.168.12.11 | grep time |cut -f7 -d " " | sed -e s/time=//g | sed -e s/loss,//g

    Diese zeil soll dort stehen wo ping -c 1 -w 1 " $4 " >/dev/null 2>&1 steht.


    #!/bin/bash

    awk '
    BEGIN { FS=";" ; OFS=";" }

    /^[ \t]*#/ { next }

    /^[ \t]*$/ { next }

    {
    ec = system ("ping -c 1 -w 1 " $4 " >/dev/null 2>&1")
    if (ec == 0) {
    ausgabe = "online"
    } else {
    ausgabe = "offline"
    }
    print $0,ausgabe
    }' $1 > $2

    exit $?


    Wie koennte man das Skript umschreiben?
     

    Beiträge vom vorherigen Thema anzeigen:   
         Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
    Seite 1 von 1

     
    Gehen Sie zu:  

    Powered by phpBB © phpBB Group
    pro_linux Theme © 2004 by Mandaxy