Bash-Verlauf ohne Zeilennummern

129

Der Bash- historyBefehl ist sehr cool. Ich verstehe, warum die Zeilennummern angezeigt werden, aber gibt es eine Möglichkeit, den Befehl history aufzurufen und die Zeilennummern zu unterdrücken?

Hier geht es darum, den Befehl history zu verwenden. Bitte antworten Sie nicht cat ~/.bash_history

Aktueller Output:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

Historische grafische Quelle.

Gewünschte Ausgabe:

man history
ls
ll
clear
cd ~
history

Historische grafische Quelle.

Vielen Dank an alle für Ihre großartigen Lösungen. Pauls ist das einfachste und wird für mich funktionieren, da meine Bash-Verlaufsgröße auf 2000 festgelegt ist.

Ich wollte auch einen coolen Artikel teilen, den ich heute Morgen gefunden habe. Es gibt einige gute Optionen, die ich jetzt verwende, z. B. doppelte Einträge aus dem Bash-Verlauf herauszuhalten und sicherzustellen, dass mehrere Bash-Sitzungen die Verlaufsdatei nicht überschreiben: http://blog.macromates.com/2008/working-with -Geschichte-in-Bash /

cwd
quelle
Darf ich fragen, warum dies cat ~/.bash_historyausgeschlossen ist?
flow2k

Antworten:

204

Versuche dies:

$ history | cut -c 8-
Paul R.
quelle
Können wir die Ausgabe des historyBefehls weiterleiten, anstatt die Datei zu lesen?
CWD
Scheint zu funktionieren! Können Sie erklären, was es tut? Wird es funktionieren, wenn die Zahlen 1 - 10.000 sind?
CWD
29
man cut. Es werden die ersten 7 Zeichen jeder Ausgabezeile des historyBefehls gelöscht . Es sollte nur Probleme, wenn die Zahl 99.999 überschreitet, etwas , das ich nie gesehen habe (und ich verwende Muscheln viel ). Aber wenn Sie darüber besorgt sind:history | sed 's/^ *[0-9]* *//'
Keith Thompson
1
Ich denke, die Lösung von @Paul R ist genau das, was ich brauche. Anfangs war mir nicht klar, dass der Befehl history die Zeilennummern mit Leerzeichen cutauffüllt, und jetzt ist die Syntax sinnvoller :) Vielen Dank an @Keith Thompson für Ihre Lösung, die für> 100.000 Historien funktioniert.
CWD
5
@cwd: Wenn Sie 100.000 Befehle in Ihrem Verlauf haben, ist es Zeit, sich von der Tastatur zurückzuziehen und nach Hause zu gehen. Wenn Sie bereits zu Hause sind, gehen Sie nach draußen. 8-)} (Ja, ich weiß, dass der Verlauf über Sitzungen hinweg beibehalten werden kann.)
Keith Thompson
22

awk kann helfen:

history|awk '{$1="";print substr($0,2)}'

Diese Antwort kann fehlschlagen, wenn Sie eine lange Geschichte haben.

Zsolt Botykai
quelle
Ha Ha, danke - substrist so viel einfacher, ich habe history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'für meine verwendet !!
Geedoubleya
17

Ich bin mir ziemlich bewusst, dass diese Frage für Bash ist und viele Leute es vorziehen würden, nicht zu zsh zu wechseln (Cue Downvotes ...)

Wenn Sie jedoch bereit waren, zu zsh zu wechseln, unterstützt zsh dies nativ (sowie andere Optionen für die Verlaufsformatierung).

zsh> fc -ln 0

(Siehe /server/114988/removing-history-or-line-numbers-from-zsh-history-file )

Att Righ
quelle
7
Eigentlich fcist auch ein basheingebauter. Der einzige Unterschied ist, dass die erste Zeile ist 1, so wäre esfc -ln 1
wisbucky
//, Haben Sie eine positive Bewertung für die Tatsache, dass ich nicht einmal wusste, dass es für die längste Zeit Alternativen zu Bash gibt, bis jemand sie in einem solchen Kontext angesprochen hat.
Nathan Basanese
11

Ich bin spät dran, aber die kürzere Methode wäre, Folgendes in Ihre ~/.bashrcoder Ihre ~/.profileDatei einzufügen:

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

Von Bash manpage:

       HISTTIMEFORMAT
              Wenn diese Variable gesetzt und nicht null ist, wird ihr Wert als verwendet
              Formatieren Sie die Zeichenfolge für strftime (3), um den zugehörigen Zeitstempel zu drucken
              mit jedem Verlaufseintrag, der vom eingebauten Verlauf angezeigt wird. Wenn
              Wenn diese Variable gesetzt ist, werden Zeitstempel in den Verlauf geschrieben
              Datei, damit sie über Shell-Sitzungen hinweg beibehalten werden können. Dies verwendet
              das Verlaufskommentarzeichen zur Unterscheidung von Zeitstempeln
              andere Geschichtslinien.

Mit dieser Funktion besteht ein Smart Hack darin, die Variable "print" zu einem Wagenrücklauf ( \r) zu machen und die Zeile (ANSI-Code K) anstelle eines tatsächlichen Zeitstempels zu löschen .

iMil
quelle
Ein bisschen einfacher, mit dunklerer Syntax:HISTTIMEFORMAT=$'\r\e[K'
Wjandrea
5
Und eine einzeilige Option:HISTTIMEFORMAT=$'\r\e[K' history
Wjandrea
5

Alternativ können Sie sed verwenden:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

Mit dem Alias ​​können Sie dies als Standard festlegen (in Ihr bash_profile einfügen):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"
Manny D.
quelle
1
\+in einem grundlegenden regulären Ausdruck ist nicht POSIX-konform. Verwenden \{1,\}Sie seddiese Option, wenn Sie die nicht standardmäßige \+Erweiterung nicht unterstützen .
Richard Hansen
4

Obwohl das Schneiden mit der -cOption für die meisten praktischen Zwecke funktioniert, denke ich, dass die Weiterleitung der Historie an awk eine bessere Lösung wäre. Beispielsweise:

history | awk '{ $1=""; print }'

ODER

history | awk '{ $1=""; print $0 }'

Beide Lösungen machen dasselbe. Die Ausgabe der Geschichte wird an awk weitergeleitet. Awk löscht dann die erste Spalte aus, die den Zahlen in der Ausgabe des Verlaufsbefehls entspricht. Hier ist awk bequemer, da Sie sich nicht um die Anzahl der Zeichen im Zahlenteil der Ausgabe kümmern müssen.

print $0ist gleichbedeutend mit print, da standardmäßig alles gedruckt wird, was in der Zeile angezeigt wird. Die Eingabe print $0ist expliziter, aber welche Sie wählen, liegt bei Ihnen. Das Verhalten von print $0und einfach printbei Verwendung mit awk ist offensichtlicher, wenn Sie awk zum Drucken einer Datei verwendet haben ( catwäre schneller zu tippen als awk, aber dies dient zur Veranschaulichung eines Punktes).

[Bsp.] Verwenden von awk, um den Inhalt einer Datei mit $ 0 anzuzeigen

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[Bsp.] Verwenden von awk, um den Inhalt einer Datei ohne explizite $ 0 anzuzeigen

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Beispiel] Verwenden von awk, wenn die Verlaufszeile mehrere Zeilen umfasst

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."
Suave-V
quelle
4
history -w /dev/stdout

Aus der Ausgabe von history --help:

-w Schreibe den aktuellen Verlauf in die Verlaufsdatei

Es schreibt den aktuellen Verlauf in die angegebene Datei - /dev/stdoutin diesem Fall.

czerny
quelle
3

historyBefehl hat keine Option zum Unterdrücken von Zeilennummern. Sie müssen mehrere Befehle kombinieren, wie alle vorschlagen:

Beispiel:

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'
Ringträger
quelle
3
Wenn Sie es sedtrotzdem durchlaufen möchten, ist der anfängliche Schnitt überflüssig - fügen Sie ihn stattdessen einfach dem Ausdruck hinzu.
Moopet
2
$ hh -n

Vielleicht möchten Sie https://github.com/dvorka/hstr ausprobieren, das das Filtern des Bash-Verlaufs im "Box-Stil" mit (optionaler) metrikbasierter Reihenfolge ermöglicht, dh es ist sowohl in Vorwärts- als auch in Rückwärtsrichtung viel effizienter und schneller:

Geben Sie hier die Bildbeschreibung ein

Es kann leicht an Ctrl-rund / oder gebunden werdenCtrl-s

Martin Dvorak
quelle
1

Sie können den Befehl verwenden cut, um es zu lösen:

Schneiden Sie Felder aus STDIN oder Dateien aus.

  • Schneiden Sie die ersten 16 Zeichen jeder STDIN-Zeile aus: cut -c 1-16

  • Schneiden Sie die ersten 16 Zeichen jeder Zeile der angegebenen Dateien aus: cut -c 1-16 file

  • Schneiden Sie alles vom 3. Zeichen bis zum Ende jeder Zeile aus: cut -c3-

  • Schneiden Sie das fünfte Feld jeder Zeile aus, indem Sie einen Doppelpunkt als Feldtrennzeichen verwenden (Standardtrennzeichen ist die Registerkarte): cut -d':' -f5

  • Schneiden Sie das 2. und 10. Feld jeder Zeile mit einem Semikolon als Trennzeichen aus: cut -d';' -f2,10

  • Schneiden Sie die Felder 3 bis 7 jeder Zeile aus, wobei Sie ein Leerzeichen als Trennzeichen verwenden: cut -d' ' -f3-7

GEOKING
quelle
0

Ich weiß, dass ich zu spät zur Party komme, aber das ist viel einfacher zu merken:

cat ~/.bash_history
Mike Slinn
quelle
Stimmt, aber die zweite Zeile von OP: "Hier geht es darum, den Befehl history zu verwenden. Bitte antworten Sie nicht auf cat ~ / .bash_history"
Cireo