Wie durchsuche ich meinen Befehlszeilenverlauf nach zuvor verwendeten Befehlen?


186

Gibt es eine andere Möglichkeit, als den Verlauf zu filtern?

Angenommen, ich möchte nach einem Befehl suchen, der mit "ssh" beginnt?

Antworten:


271

Drücken Sie Ctrl+ Rund geben Sie ein ssh. Ctrl+ Rstartet die Suche vom letzten zum alten Befehl (Rückwärtssuche). Wenn Sie mehr als einen Befehl haben, der mit beginnt ssh, drücken Sie immer wieder Ctrl+ R, bis Sie die Übereinstimmung gefunden haben.

Sobald Sie die Übereinstimmung gefunden haben, können Sie drücken Enter, um den Befehl auszuführen, oder den linken / rechten Cursor, um nur den Text des Befehls auszuwählen.

Es gibt keine Standardumkehroption für Ctrl+ R, um die Suchrichtung umzukehren, aber hier finden Sie einige Vorschläge dazu.


90

Wenn Sie nur Ihren Verlauf durchsuchen möchten, können Sie einfach history | grep sshssh verwenden und durch das ersetzen, was Sie durchsuchen möchten.


Ich verwende diese Methode, weil ich jeden Befehl, der meinem Filter entspricht, in der Liste ansehe.
Pisu

15

Ich mache eine kleine Abwandlung des oben Genannten, funktioniert gut für mich (wenn Sie sich auf Ihre Bash-Geschichte beziehen)

In meinem Home-Ordner erstelle ich eine Datei mit dem Namen

.inputrc

Drinnen geht das

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Hinweis: Das oben genannte scheint in 14.04 nicht mehr zu funktionieren, also macht dies dasselbe -

"\e[A":history-search-backward
"\e[B":history-search-forward

Wenn Sie dann einen beliebigen vorherigen Befehl eingeben und die Bild-auf / Bild-dn-Schaltflächen verwenden, wird der Verlauf durchsucht, wobei immer mit Bild-auf begonnen wird


Wenn Sie über Root-Berechtigungen verfügen, können Sie / etc / inputrc bearbeiten, damit dies für alle Benutzer funktioniert.
Wolfy

1
@doug, hmm .. Ich habe Ubuntu 15.04. Diese Lösung funktioniert, aber versauen Sie die Tasten Strg + Pfeil links / Strg + Pfeil rechts. Das Problem sieht so aus, als würde eine .inputrc-Datei erstellt und keine Einträge darin.
Ravi

Vergessen Sie nicht, .inputrc erneut zu binden oder das Terminal zu schließen
David Brossard

14

Durch Drücken von Ctrl+ Rwird der "Reverse-i-Search" -Modus gestartet. Wenn Sie "ssh" eingeben, wird Ihr Verlauf nach Befehlen durchsucht, die "ssh" enthalten.


9

Hier ist eine andere Methode, bei der klassische Befehle verwendet werden (die mit größerer Wahrscheinlichkeit in allen Distributionen funktionieren). Der Befehlsverlauf wird in der Datei .bash_historyin Ihrem Ausgangsverzeichnis gespeichert. Gehen Sie dazu folgendermaßen vor:

grep "ssh" ~/.bash_history

Vergessen Sie die -iFlagge nicht, wenn Sie eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung benötigen.


history | grep sshIch werde nur temporäre Session-ssh anzeigen, also würde ich diese Antwort anstreben.
Iniravpatel

3

Ich habe die folgende Funktion irgendwo im Internet gefunden und sie sehr effektiv genutzt. Fügen Sie dies in Ihre ~/.bashrc:

hgrep () { 
    history | egrep --color=auto --recursive "$@" | egrep --color=auto --recursive -v "hgrep $@"
}

Jetzt neu laden Shell: exec bash. Sie haben jetzt einen neuen Befehl, den Sie wie folgt verwenden können:

hgrep ssh

Es wird Ihnen eine Liste passender Befehle aus Ihrem Verlauf angezeigt. Um einen Befehl auszuführen, geben Sie !gefolgt von der Befehlsnummer ein. Hier ist ein Beispiel:

~:$ hgrep scp
  207  tn scp foreign-teachers __HOST__:unity.log __HOST__:compiz.log .
  421  tn scp scott-laptop __HOST__:Scott\ Severance.asc .
  422  tn scp scott-laptop __HOST__:'Scott\ Severance.asc' .
  468  tn scott-desktop scp -r Backgrounds/* __HOST__:Pictures/Backgrounds
  469  tn scott-laptop scp -r Backgrounds/* __HOST__:Pictures/Backgrounds
  470  scp -r Backgrounds/* 192.168.1.2:Pictures/Backgrounds
~:$ !207

Ich mag diesen Ansatz besser als Ctrl+, Rda er flexiblere Suchvorgänge ermöglicht und ich mehrere Ergebnisse gleichzeitig sehen kann.




1

Der Verlauf ist gut, aber begrenzt. Ich bevorzuge es, meine Bash-Umgebung so einzurichten, dass ich alle Befehle protokolliere, die ich jemals ausgeführt habe, zusätzlich zu dem Verzeichnis, in dem sie ausgeführt wurden. Anschließend führe ich einen Befehl aus, um alle Befehle aufzulisten Ich habe im aktuellen Verzeichnis ausgeführt, das ich per Pipe an grep usw. senden kann - es heißt "dish", siehe:

https://github.com/wolfwoolford/dish

Wenn Sie auf den Punkt kommen möchten, geben Sie dies einfach in Ihrer .bashrc-Datei an ( https://github.com/wolfwoolford/dish/blob/master/dishrc ).

Es gibt auch einen wirklich nützlichen Befehl namens "dishg" - oder "dish global" -, der jeden Befehl ausgibt, der jemals ausgeführt wurde, unabhängig vom Verzeichnis. Offensichtlich ist dieses nur nützlich, wenn es mit Grep und Tail usw. verwendet wird.

Ich benutze es seit Jahren und es ist buchstäblich das erste, was ich installiere, wenn ich eine neue Box einrichte. Es protokolliert die Befehle, die Sie in Textdateien in einem versteckten Verzeichnis (~ / .dish) ausführen. Ich hatte noch nie ein Problem mit dem Speicherplatz ...


0

Wollte dies als Kommentar zu @ssmy schreiben , konnte aber die Formatierung im Kommentar nicht erhalten, um zusammenzuarbeiten.

Nachdem Sie den Verlauf mit durchsucht haben history | grep ssh, können Sie den gewünschten Befehl ausführen, indem Sie dessen Nummer mit einem Ausrufezeichen voranstellen, z !42.

Beispiel:

$ history | grep ssh
  5 ssh me@someserver.net
 13 ssh me@someotherserver.net
 42 ssh me@thisone.com
$! 42
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.