grep..binärdatei..bash_history

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von OsunSeyi, 09.08.2007.

  1. #1 OsunSeyi, 09.08.2007
    OsunSeyi

    OsunSeyi Foren As

    Dabei seit:
    09.08.2007
    Beiträge:
    94
    Zustimmungen:
    0
    Hi erstmal,
    ist mein erster Beitrag / Frage hier.:)
    Zunächst der Beitragstitel...naja, sorry.
    Ich will die ~/.bash_history mit grep auslesen, grep aber behauptet (wie auch kwrite) die
    bash_history sei eine Binärdatei. Eigentlich aber ist´s doch plain text ?
    Jedenfalls spuckt grep keinen Text aus, sondern nur, daß der Suchbegriff gefunden wurde.
    SED hat damit kein Problem...
    Der Hintergrund ist die Idee, in der Shell einen Befehl absetzen zu können, der sagt:
    kopier die letzten n Eingaben in die Datei bash_hist_media (zB. um diverse convert oder 'ffmpeg -i INTER/Inter2.mpg -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 300x246 -sameq inter2.avi' unterbringen zu können).
    Die Bashhistory mit ihren (bei mir) 1000 Einträgen erschöpft sich schneller als man glaubt und weg ist weg...
    Also dachte ich ein Shellscript, was selber nicht viel tut, und zB so aufgerufen wird:
    copy media 5
    (kopier die letzten 5 Eingaben nach bash_hist_media).
    Taucht diese Zeile in der ~/.bash_history auf, sollte es ein Leichtes sein, mittels Cron regelmässig ein script laufen zu lassen, was (mit 'grep -B 5 copy', vereinfacht) die Befehlszeile findet und eben diese gefundenen 5 Zeilen in die angegebene Datei kopiert.
    Ob das elegant ist, weiß ich nicht. Es erscheint mir einfacher, als manuell zu kopieren.
    Aber jedenfalls will grep aus der ~/.bash_history nix lesen.
    Oder ich verwende die falschen Optionen. Es wäre ja auch denkbar, erst eine temporäre Datei aus der ~/.bash_history erstellen zu lassen, die dann keine Binärdatei mehr ist...?
    > cat ~/.bash_history > bash_hist.tmp
    > grep copy bash_hist.tmp
    ändert nix (konnte man sich denken)
    Gruß, Tom
     
  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. #2 z-shell, 09.08.2007
    z-shell

    z-shell Debianator

    Dabei seit:
    30.05.2007
    Beiträge:
    434
    Zustimmungen:
    0
    Ort:
    /home/z-shell
    Seltsam!

    Code:
    ┌─(ROOT@debian:pts/2)───────────────────────────────────────────────────────────────────────────(/home/z-shell)─┐
    └─(21:54:#)── grep mount ~/.bash_history                                                           ──(Do,Aug09)─┘
    mount
    mount /dev/sdb3 /mnt/
    
    Was ist mit tail?
    Code:
    tail -n10 > file
     
  4. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Setze für solche Kommandos doch ein Alias:

    Code:
    alias gugus="echo welches file?; read DATEI; ffmpeg -i INTER/\$DATEI -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 300x246 -sameq \$DATEI"
    Musst du in die .profile oder .bashrc reinputten, anschliessend kannst du nur noch
    Code:
    gugus
    Eingeben. Sollte so eigentlich funktionieren.
     
  5. smg

    smg Regex Fetischist

    Dabei seit:
    20.05.2007
    Beiträge:
    195
    Zustimmungen:
    0
    Ort:
    /home/stephan/
    tr0nix:
    Wieso Alias? Da würde ich direkt ne Funktion schreiben, dann wirds noch generischer. :)
     
  6. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Ja hast eigentlich recht.. im Prinzip könnte man auch ein Wrapperscript schreiben oder wie du sagtest als Funktion und mit $1 arbeiten.. da sieht man mal wieder wie schön flexibel Unix/Linux ist :).
     
  7. #6 OsunSeyi, 09.08.2007
    OsunSeyi

    OsunSeyi Foren As

    Dabei seit:
    09.08.2007
    Beiträge:
    94
    Zustimmungen:
    0
    Ohh- vielen Dank für die schnelle Reaktion !
    Code:
    tom@TOURNEE:~> grep cat  ~/.bash_history
    Übereinstimmungen in Binärdatei /home/tom/.bash_history.
    
    ...so sieht´s aus, jedenfalls hier.
    tail ist auch nicht gut, weil die Befehlszeilen nicht ad hoc in der ~/.bash_history auftauchen, sondern (spätestens) nach Beendigung des X-Terminals. Dann könnte man auch manuell kopieren.
    Ja, es stimmt, daß es irgendwie schon unglaublich ist, was mit relativ minimalen Kentnissen schon möglich ist. Aber natürlich auch Dank der Community :))
    Gruß, Tom
    PS
    Was meinst Du genau ?
     
  8. NoXqs

    NoXqs Routinier

    Dabei seit:
    07.05.2007
    Beiträge:
    420
    Zustimmungen:
    0
    Ort:
    Bremen
    Es ist schon sehr merwürdig, dass deine .bash_history kein reines ASCII-File ist.
    Ich würde mal forschen, warum es bei dir keines ist.

    Zur Not das Ding mal wegschieben und neu anlegen.
     
  9. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Du kannst auf folgendes in das Profil eintragen:
    Code:
    function mpegwandler {
    ffmpeg -i INTER/$1 -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 300x246 -sameq $1";
    }
    
    Anschliessend neu einloggen und du kannst "mpegwandler test.avi" eintippen.
     
  10. #9 OsunSeyi, 16.08.2007
    Zuletzt bearbeitet: 25.08.2007
    OsunSeyi

    OsunSeyi Foren As

    Dabei seit:
    09.08.2007
    Beiträge:
    94
    Zustimmungen:
    0
    Also,
    ich hab mir mal was ausgedacht, ob´s auch funktioniert ist aber noch nicht probiert...
    Dies ist der 'Dummy'-Befehl copy -datei -n_zeilen:
    Code:
    #!/bin/sh
    
    case "$1" in
    	    1)	zeile="1" ;;
    	    2)	zeile="2" ;;
    	    3)	zeile="3" ;;
    	    4)	zeile="4" ;;
    	    5)	zeile="5" ;;
    	    *)  zeile="[1-5 Zeilen]" ;;
    esac
    
    case "$2" in
    	media)	progr="bash_history_media"	;;
    	   ps)	progr="bash_history_ps"		;;
    	 unix)	progr="bash_history_unix"	;;
    	    *)	progr="[spezifiziere: media, unix, ps]" ;;
    esac
    
    echo "Kopiert "$zeile" Zeilen nach "$progr" !"
    exit 0
    ...und das eigentlich kopierende Script copy_awk, welches das eigendlich wirklich kopierende Script awk_tmp generiert (Cron-Job)
    Code:
    #!/bin/sh
    	cd /home/tom/DAT/D/BIN/BIN_AWK
    	# Schreibe copy-Befehle in ausführbare Datei 'copy_tmp':
    cat /home/tom/.bash_history | awk '
    
      BEGIN {print "#!/bin/sh"}
    
    # Abspeichern jeder Zeile als Array-Element:
    	{ zeile[NR] = $0 }
    
    # Ausgabe aller Zeilen _vor_ der Zeile copy,
    # Zeilenanzahl im 2.Einzelstring der betreffenden Zeile -> $2:
    # Zieldatei $3
    
      $1=="copy" && $3!=""	{
    			print "echo \""
    			for (X = NR-$2 ; X<= NR-1 ; X++)
    			print zeile[X]
    			print "\" > /home/tom/DAT/D/BIN/BIN_AWK/bash_history_"$3".tmp"
    			} ' > copy_tmp
    
    	# Führe copy_tmp aus:
    copy_tmp
    	# MEDIA
    cat /home/tom/DAT/D/CONF/bash_history_media >> bash_history_media.tmp
    sort bash_history_media.tmp | uniq > /home/tom/DAT/D/CONF/bash_history_media
    	# UNIX
    cat /home/tom/DAT/D/CONF/bash_history_unix >> bash_history_unix.tmp
    sort bash_history_unix.tmp | uniq > /home/tom/DAT/D/CONF/bash_history_unix
    	# PS
    cat /home/tom/DAT/D/CONF/bash_history_ps >> bash_history_ps.tmp
    sort bash_history_ps.tmp | uniq > /home/tom/DAT/D/CONF/bash_history_ps
    
    Natürlich muß copy_tmp vorher angelegt und ausführbar gemacht werden.
    Na denn...:bounce:
    Gruß, Tom
    P.S. hoffentlich stimmt es jetzt
     
  11. #10 OsunSeyi, 06.12.2007
    OsunSeyi

    OsunSeyi Foren As

    Dabei seit:
    09.08.2007
    Beiträge:
    94
    Zustimmungen:
    0
    OK - ich zitiere mal:
    history [-anrw] [Datei]

    -a [Datei]
    veranlaßt das Sichern der in der aktuellen Sitzung neu entstandenen History-Zeilen in das History-File bzw. in die angegebene Datei
    -c
    löscht alle Einträge in der History
    -n [Datei]
    veranlaßt das Lesen neuer Einträge aus dem History-File bzw. aus der angegebenen Datei
    -p Muster
    führt eine History-Expansion mit dem angegebenen Muster durch
    -r [Datei]
    ersetzt den Inhalt der History durch den Inhalt der Datei
    -s Eintrag
    hängt den angegebenen Eintrag an das Ende der History an
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 Wolfgang, 06.12.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Wenn deine bash_history von grep als Binärdatei erkannt wird, dann hast du Zeichen drin, die entweder nicht im richtigen Zeichensatz erstellt wurden, oder echte Steuerzeichen sind.
    (Passiert mitunter wenn eine Binärdatei ins Terminal ausgegeben wird und man danach enter drückt).

    Nur so als Hinweis!
     
  14. #12 OsunSeyi, 10.12.2007
    OsunSeyi

    OsunSeyi Foren As

    Dabei seit:
    09.08.2007
    Beiträge:
    94
    Zustimmungen:
    0
    Ja, in der Tat.
    Habe sie mit Kwrite geöffnet (und kwite warnt vor Abspeichern einer Binärdatei).
    Normal sollten doch 'unschreibbare' Sonderzeichen als Kästchen erscheinen?
    Aber trotzdem nichts gefunden.
    Jedenfalls hat einfaches abspeichern geholfen; jetzt akzeptiert auch grep die Datei !
    Danke nochmals &
    viele Grüße :)
     
Thema: grep..binärdatei..bash_history
Besucher kamen mit folgenden Suchen
  1. sed findet nicht in großer Binärdatei