grep Nachhilfe gesucht

  • Wie kann ich die Werte in Klammern aus folgendem Dateiinhalt auslesen?


    0:01:47.18 audio channel change from 2 to 6 (2692)*
    0:30:50.23 audio channel change from 6 to 2 (46272)
    0:41:09.08 audio channel change from 2 to 6 (61732)*
    1:00:55.10 audio channel change from 6 to 2 (91384)
    1:10:36.21 audio channel change from 2 to 6 (105920)*
    1:28:21.08 audio channel change from 6 to 2 (132532)
    1:38:47.06 audio channel change from 2 to 6 (148180)*
    1:49:28.13 audio channel change from 6 to 2 (164212)


    MARK1=$(grep ?????) # Wert 2692
    MARK2=$(grep ?????)
    MARK3=$(grep ?????)
    ...


    Anzahl=$(grep ?????) Anzahl der MARKs




    Danke

  • z.B. mit cut


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Hier mal ein andres Beispiel, wie man sowas machen kann:



    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Ist vielleicht nicht die beste Lösung. Aber ich löse das immer mit awk und sed

    Code
    grep ..... | awk -F'(' '{ print $1 }' | sed 's/).*//'


    Gruß Patrick

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Danke schonmal aber ich bekomms mit grep und cut nicht hin.


    In dieser Datei (Inhalt von marks einer Aufnahme) möchte ich die 96 und die 419361 erhalten


    0:00:01.47 detected logo start (96)*
    2:19:47.12 audio channel change from 5 to 2 (419361)




  • Bei mir funktioniert das mit cut:


    Code
    t1="0:00:01.47 detected logo start (96)*"
    t2="2:19:47.12 audio channel change from 5 to 2 (419361)"
    
    
    t=$(echo $t1 | cut -f 2 -d "(" | cut -f 1 -d ")")
    t=$(echo $t2 | cut -f 2 -d "(" | cut -f 1 -d ")")


    Code
    + t1='0:00:01.47 detected logo start (96)*'
    + t2='2:19:47.12 audio channel change from 5 to 2 (419361)'
    ++ cut -f 2 -d '('
    ++ cut -f 1 -d ')'
    ++ echo 0:00:01.47 detected logo start '(96)*'
    + t=96
    ++ cut -f 1 -d ')'
    ++ cut -f 2 -d '('
    ++ echo 2:19:47.12 audio channel change from 5 to 2 '(419361)'
    + t=419361


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Ich würde ja gleich zu Perl greifen.


    Viel zu fett. Ich favorisiere die Lösung von jsffm. Nichts gegen regular expressions, aber warum benutzen wenn nicht nötig? Und wenn doch, dann helaus Ansatz.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • es geht aber nichts ueber awk :)


    Code
    awk -F'[()]' '{ print "MARK" ++cnt "=" $2 }' << !
    0:01:47.18 audio channel change from 2 to 6 (2692)*
    0:30:50.23 audio channel change from 6 to 2 (46272)
    0:41:09.08 audio channel change from 2 to 6 (61732)*
    1:00:55.10 audio channel change from 6 to 2 (91384)
    1:10:36.21 audio channel change from 2 to 6 (105920)*
    1:28:21.08 audio channel change from 6 to 2 (132532)
    1:38:47.06 audio channel change from 2 to 6 (148180)*
    1:49:28.13 audio channel change from 6 to 2 (164212)
    !


    Code
    MARK1=2692
    MARK2=46272
    MARK3=61732
    MARK4=91384
    MARK5=105920
    MARK6=132532
    MARK7=148180
    MARK8=164212


    soll es so aussehen?


    - sparkie

  • Denkt dran, es sieht zwar elegant aus, awk, sed, oder ähnliche Tools zu benutzen zu können und die Community zollt einem dann auch Bewunderung. Aber Programmieren sollte nicht unbedingt nur dem Auge dienen. Ein Shell script mit inline commands ist allemal schneller. Hier findet kein Prozesswechsel statt oder irgendwelche kontextswitches quer durch das Linux system. Deshalb wäre mein Favorit die Lösung von Hopsi.


    Ich hab schon Leute gesehen, die stat eines effektiven Scripts, eine Plattendiagnostic geschrieben haben, weil sie dann in einer Schleife 100000 mal ls aufgerufen haben.


    Der Programmierer machts nur einmal. Das Programm rennt nachher millionenfach, d.h. da sollte dann die Performance liegen, auch wenns vom Coding her vielleicht Scheiße aussieht.



    Gruß
    msv

  • Denkt dran, es sieht zwar elegant aus, awk, sed, oder ähnliche Tools zu benutzen zu können und die Community zollt einem dann auch Bewunderung. Aber Programmieren sollte nicht unbedingt nur dem Auge dienen. Ein Shell script mit inline commands ist allemal schneller. Hier findet kein Prozesswechsel statt oder irgendwelche kontextswitches quer durch das Linux system. Deshalb wäre mein Favorit die Lösung von Hopsi.

    Mit der Konstruktion habe ich schon sehr viele Scripte gebastelt.
    Das ist in der Tat wahnsinnig schnell, muß ich sagen...


    Das unset am Ende bitte nicht vergessen, sonst kommt's im weiteren Scriptverlauf oft zu unvorhergesehenen Effekten. Ich spreche aus Erfahrung. 8)


    Christian

  • weil IFS einfach zu löschen ist auch keine Lösung. Sonst hast du im weiteren Verlauf deine Parameter delimiter kaputt....

    Mit unset hatte ich bisher keine Probleme.



    Zitat

    aus http://wiki.bash-hackers.org/s…ernal_field_separator_ifs
    The IFS variable holds the characters that Bash sees as word boundaries in this step. The default contains the characters


    • <space>
    • <tab>
    • <newline>

    These characters are also assumed when IFS is unset. When IFS is empty (nullstring), no word splitting is performed at all.

    Christian

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!