grep..binärdatei..bash_history

OsunSeyi

OsunSeyi

Foren As
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
 
Aber jedenfalls will grep aus der ~/.bash_history nix lesen.
Seltsam!

Code:
┌─(ROOT@debian:pts/2)───────────────────────────────────────────────────────────────────────────(/home/z-shell)─┐
└─(21:54:#)── grep mount ~/.bash_history                                                           ──(Do,Aug09)─┘
mount
mount /dev/sdb3 /mnt/

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

Was ist mit tail?
Code:
tail -n10 > file
 
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.
 
tr0nix:
Wieso Alias? Da würde ich direkt ne Funktion schreiben, dann wirds noch generischer. :)
 
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 :).
 
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
tr0nix:
Wieso Alias? Da würde ich direkt ne Funktion schreiben, dann wirds noch generischer.
Was meinst Du genau ?
 
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.
 
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.
 
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
 
Zuletzt bearbeitet:
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
 
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!
 
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 :)
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

Queue für copy Script

[HowTo] NVidia und 3D unter SuSE/openSUSE

Server-Monitoring mit RRDTool

mencoder TV

Zurück
Oben