Anzeige:
Ergebnis 1 bis 15 von 15

Thema: Grep - nur den ersten Fund anzeigen

  1. #1
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118

    Grep - nur den ersten Fund anzeigen

    Hi Leute,

    ich möchte bei einer Filterung nur den ersten übereinstimmenden Eintrag mir anzeigen lassen.

    Jul 11 14:15:03 router pppd[674]: Connect time 5.2 minutes.
    Jul 11 14:17:24 router pppd[726]: Connect time 2.0 minutes.
    Jul 11 14:20:49 router pppd[772]: Connect time 0.4 minutes.

    [...]

    Jul 29 17:37:05 router pppd[2014]: Connect time 10.1 minutes.
    Jul 29 17:47:12 router pppd[2063]: Connect time 10.1 minutes.
    Jul 29 18:02:18 router pppd[2111]: Connect time 15.1 minutes.

    Dies ist ein kleiner Auszug aus der Datei. Ich möchte jetzt halt nur den 1. Eintrag zum "Jul 11" bzw "Jul 29".
    Wie kann ich das mit Grep erreichen??? Oder einem anderen Tool???

    Gruß Hardwarerosti

  2. #2
    Registrierter Benutzer
    Registriert seit
    Dec 2001
    Ort
    Berlin
    Beiträge
    178
    Hi,

    das geht auch mit grep alleine:
    Code:
    grep "Connect time" /var/log/messages | grep -n "Connect time" | grep "^1:"

  3. #3
    Registrierter Benutzer Avatar von phoen][x
    Registriert seit
    Jun 2002
    Ort
    Hildesheim
    Beiträge
    560
    Wenn ich dich richtig verstanden habe hwrosti, willst du doch lediglich die unterschiedlichen Tage haben (und zwar jeden nur einmal), oder?

    Das geht mit
    Code:
    grep "Connect time" foofile  | cut -d " " -f 1,2 | sort | uniq
    Btw, ist das immer noch das gleiche skript?

    -phoen][x-
    (*'-._.: System Stats :._.-'*)
    2400MHz Pentium 4 HT w/ 1024MB Dual-channeled DDRAM; ATI Radeon 9700Pro w/ 128 MB DDRAM; WinTV Go; Intel EtherExpress Pro 1000 onboard; Maxtor 160GB @ 7200 RPM, Serial-ATA; Maxtor 80GB @ 5400 RPM, UDMA-100; Sony 24/10/40x CD-RW Drive; Pioneer 16x DVD Drive

  4. #4
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Jo, merci Leute.

    @ phen: Naja ich will im Grunde nur wissen, wann meine Logdatei angefangen hat mit loggen (1. Zeile).

    Deswegen brauche ich die erste Zeile.

  5. #5
    Registrierter Benutzer Avatar von phoen][x
    Registriert seit
    Jun 2002
    Ort
    Hildesheim
    Beiträge
    560
    Na das ist ja supereinfach.
    Code:
    grep 'Connect time' foofile  -m 1
    Der letzte Eintrag geht mit
    Code:
    grep 'Connect time' foofile  | tail -1
    Ich dachte du wolltest statistikmaessig die Tage haben an denen du online warst - zugeordnet zu der taeglichen Onlinezeit. Da lag ich wohl falsch.

    -phoen][x-
    Geändert von phoen][x (02.08.02 um 11:37 Uhr)
    (*'-._.: System Stats :._.-'*)
    2400MHz Pentium 4 HT w/ 1024MB Dual-channeled DDRAM; ATI Radeon 9700Pro w/ 128 MB DDRAM; WinTV Go; Intel EtherExpress Pro 1000 onboard; Maxtor 160GB @ 7200 RPM, Serial-ATA; Maxtor 80GB @ 5400 RPM, UDMA-100; Sony 24/10/40x CD-RW Drive; Pioneer 16x DVD Drive

  6. #6
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Ja schon, da lagst Du komplett richtig.
    Ich habe aber alle sämtlichen Tage schon in einer anderen Datei drinnestehen.
    Ich rechne immer nur die Onlinezeit zusammen und muss aber wissen in welchen Zeitraum, da ich ja die Logfiles nicht so beieinflussen kann wie ich will.
    Deswegen reicht mir der erste Eintrag und der letzte.

    Trotzdem Merci

  7. #7
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Bzw. mir ist soeben noch etwas anderes eingefallen.

    Ich bräuchte auch eine Möglichkeit den ersten Fund eines bestimmten suchbegriffes anzuzeigen.

    Wenn ich also nach xxx | "egrep '(Jul.31.*Connect.time)'

    suche, dann muss mir nur der erste Fund angezeigt werden.

  8. #8
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    @ phoen

    die option -m 1 scheints bei mir irgendwie nicht zu geben ;-)
    Ich bekomme immer ne Meldung daß es keine gültige OPtion ist.

  9. #9
    Registrierter Benutzer Avatar von phoen][x
    Registriert seit
    Jun 2002
    Ort
    Hildesheim
    Beiträge
    560
    Nicht dass du glaubst, dass ich dir Mist erzaehlt habe:

    Code:
    phoenix@whb01694 phoenix $ grep 'Connect time' data  -m 1
    Jul 11 14:15:03 router pppd[674]: Connect time 5.2 minutes.
    aus "man grep":
    Code:
           -m NUM, --max-count=NUM
                  Stop reading a file after NUM matching lines.  If the input is
                  standard input from a regular file, and NUM matching lines are
                  output, grep ensures that the standard input is positioned  to
                  just  after  the last matching line before exiting, regardless
                  of the presence of trailing context  lines.   This  enables  a
                  calling process to resume a search.  When grep stops after NUM
                  matching lines, it outputs any trailing context  lines.   When
                  the  -c or --count option is also used, grep does not output a
                  count greater than NUM.  When the -v or --invert-match  option
                  is  also  used,  grep  stops after outputting NUM non-matching
                  lines.
    und:
    Code:
    phoenix@whb01694 phoenix $ grep --version
    grep (GNU grep) 2.5
    
    Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    /me is puzzled.

    -phoen][x-
    (*'-._.: System Stats :._.-'*)
    2400MHz Pentium 4 HT w/ 1024MB Dual-channeled DDRAM; ATI Radeon 9700Pro w/ 128 MB DDRAM; WinTV Go; Intel EtherExpress Pro 1000 onboard; Maxtor 160GB @ 7200 RPM, Serial-ATA; Maxtor 80GB @ 5400 RPM, UDMA-100; Sony 24/10/40x CD-RW Drive; Pioneer 16x DVD Drive

  10. #10
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Ist mir schon klar, habe dann mal sofort bei mir geschaut und Tatsache, hier das Erg aus "man grep"

    -NUM Same as --context=NUM lines of leading and trailing
    context. However, grep will never print any given
    line more than once.

    habe version 2.4

  11. #11
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Habe grad mal noch bissl getestet:

    bei mir lautet der Befehl für das selbe:

    egrep '(Connect.time)' /var/log/localmessages -0

  12. #12
    Registrierter Benutzer Avatar von phoen][x
    Registriert seit
    Jun 2002
    Ort
    Hildesheim
    Beiträge
    560
    Zu dem anderen problem. Du willst immer die erste Zeile von einem bestimmten Datum, richtig? Okay, nehmen wir an foofile ist deine logdatei und das -m funktioniert, dann ist das hier dein fertiges Programm:

    Code:
    #!/bin/bash
    
    // Location of the file
    FILE="foofile"
    
    // Dont modify these lines
    COUNT=0
    LINE=""
    
    for ELEMENT in `grep "Connect time" ${FILE}  | cut -d " " -f 1,2 | sort | uniq`
    do
      COUNT=`expr ${COUNT} + 1`
      LINE="${LINE}${ELEMENT} "
     
      if([ `expr ${COUNT} % 2` == 0 ]) then
        SUM=0
        for NUM in `grep "Connect time" ${FILE} | grep "${LINE}" | cut -d " " -f 8`
        do 
          SUM=`echo "${SUM} + ${NUM}" | bc` 
        done
        echo "${LINE}: ${SUM} minutes"
        LINE=""
      fi
    done
    Sorry, ich war zu faul auch noch ${1} mit einzubauen, kannst du ja noch machen.

    -phoen][x-
    [nachtrag]
    oops, ich hab ja gar kein "grep -m" eingesetzt...
    [/nachtrag]
    (*'-._.: System Stats :._.-'*)
    2400MHz Pentium 4 HT w/ 1024MB Dual-channeled DDRAM; ATI Radeon 9700Pro w/ 128 MB DDRAM; WinTV Go; Intel EtherExpress Pro 1000 onboard; Maxtor 160GB @ 7200 RPM, Serial-ATA; Maxtor 80GB @ 5400 RPM, UDMA-100; Sony 24/10/40x CD-RW Drive; Pioneer 16x DVD Drive

  13. #13
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Jo, super,

    aber ich verstehe noch nicht, warum du die If Anweisung drinne hast???????????????????????????

    Er schaut da ja nach obs 0 ist, 0 ist ja immer bei ungeraden Zeilen (1,3,5 usw). Was hat dies für einen Sinn???????

    Wenn ich die If Anweisung raus nehme, dann funktionierts super, ansonsten bekomme ich immer nur Null-Werte.

    Gruß

  14. #14
    Registrierter Benutzer Avatar von phoen][x
    Registriert seit
    Jun 2002
    Ort
    Hildesheim
    Beiträge
    560
    Das "if([ `expr ${COUNT} % 2` == 0 ]) then"? Tja, die for() Schleife gibt die Datumswerte nicht in einem durchgang zurueck sondern immer einmal den Monat, danach den Tag (liegt an der Leerstelle). Soll heissen, im ersten Durchlauf gibts ein "Jul" und im zweiten eine "11". Das baue ich dann zusammen und greppe danach (aber nur jede zweite Zeile)

    Anders geht es (zumindest hier) nicht. Wenn ich das if() loesche gibts das hier als Ausgabe:

    Code:
    phoenix@whb01694 phoenix $ ./foo.sh 
    Jul : 42.9 minutes
    11 : 7.6 minutes
    Jul : 42.9 minutes
    29 : 35.3 minutes
    mit if() gibt es:
    Code:
    phoenix@whb01694 phoenix $ ./foo.sh 
    Jul 11 : 7.6 minutes
    Jul 29 : 35.3 minutes
    -phoen][x-
    ps.: vielleicht ist es ja wieder dein 2.4 grep...
    (*'-._.: System Stats :._.-'*)
    2400MHz Pentium 4 HT w/ 1024MB Dual-channeled DDRAM; ATI Radeon 9700Pro w/ 128 MB DDRAM; WinTV Go; Intel EtherExpress Pro 1000 onboard; Maxtor 160GB @ 7200 RPM, Serial-ATA; Maxtor 80GB @ 5400 RPM, UDMA-100; Sony 24/10/40x CD-RW Drive; Pioneer 16x DVD Drive

  15. #15
    Registrierter Benutzer
    Registriert seit
    May 2002
    Ort
    Stuttgart
    Beiträge
    118
    Jo deswegen also. Gut zu wissen.

    Ich hatte jetzt auch mal das Script debuggt um es zu verstehen. Und an der stelle vom cut habe ich mal awk genommen (auch wenn ich da evtl. mit Kanonen auf Spatzen schiesse) weil: wenn Du Jul 1 hat, dann bekommst nur das Jul, da cut vermutlich die 2. Leerstelle als 2. Stelle nimmt.
    Und jetzt mit awk klappts super.

    Merci nochmals

    P.S. habe das mit dem "test" auch schon implementiert.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •