Bash - inkrementelle Verlaufssuche (Strg + R) - Übereinstimmung mehrerer nicht benachbarter Wörter

8

Wenn Sie Ctrl+ verwenden R, um den Bash-Verlauf zu durchsuchen, gibt es eine Möglichkeit, zwei Wörter zu finden, die nicht nebeneinander liegen. Zum Beispiel, sagen wir , ich den letzten Befehl finden wollte , die enthalten httpdund , awkaber nicht nebeneinander. Gibt es eine bessere Option, als den Bash-Verlauf nach beiden zu durchsuchen oder Ctrl+ Rzu drücken, um durch Einträge zu blättern, die einem Schlüsselwort entsprechen, bis der gewünschte Befehl gefunden wird?

sa289
quelle

Antworten:

3

Das Bash-Referenzhandbuch lautet :

Readline bietet Befehle zum Durchsuchen des Befehlsverlaufs nach Zeilen, die eine angegebene Zeichenfolge enthalten

Sie möchten einen regulären Ausdruck anstelle einer festen Zeichenfolge.

Versuchen Sie hstr :
1. Installation
2. Konfiguration

Sie sollten so etwas sehen mit hstr:
Geben Sie hier die Bildbeschreibung ein

Update :
Ein weiteres Tool ist fzf .

  1. Installieren : git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install

  2. Quelle ~/.bashrc:source ~/.bashrc

Sie sollten so etwas sehen mit fzf: Geben Sie hier die Bildbeschreibung ein

Evgeny Vereshchagin
quelle
2

Ich kenne keine eingebaute Möglichkeit, dies zu tun, aber Sie können eine kleine Funktion schreiben, um das Grep durchzuführen und Ihre Verlaufsdatei so zu bearbeiten, dass die Ergebnisse am Ende angezeigt werden, und Sie können dann einfach eine der Übereinstimmungen auswählen durch die neue Geschichte aufsteigen. (Dies ändert die Reihenfolge der Befehle in Ihrem Verlauf).

Hier ist eine solche Funktion. Ich gehe davon aus, dass Sie die 2 (oder mehr) Wörter finden möchten, unabhängig davon, in welcher Reihenfolge sie erscheinen. Sie können die maximale Anzahl von Übereinstimmungen festlegen, die Sie akzeptieren möchten. hier ist es 10. Ich gehe auch davon aus, dass das anfängliche grep keine humorvolle Zeichenfolge zurückgibt, oder Sie müssen temporäre Dateien anstelle von Bash-Zeichenfolgen verwenden.

hist(){
    local maxmatches=10 word=$1 matches new nummatches
    shift
    history -w # write out history to HISTFILE
    matches=$(grep -e "$word" $HISTFILE)
    for word
    do   new=$(echo "$matches" | grep -e "$word")  || return # if str too big
         matches=$new
    done
    nummatches=$(echo "$matches" | wc -l)
    echo "$nummatches matches"
    if [ $nummatches -gt 0 -a $nummatches -le $maxmatches ]
    then echo "$matches" >>$HISTFILE # add matches to end of file
         history -c # clear history
         history -r # read history from file
         history $nummatches # show last few lines
    else echo "zero or too many matches. (max $maxmatches)"
    fi
}

Wenn Sie keine Regexp-Musterübereinstimmung für Ihre Wörter wünschen, verwenden Sie fgrep anstelle von grep. Wenn Sie nur die angegebene Reihenfolge möchten, verwenden Sie ein einzelnes Wort wie "httpd. * Awk". Sie können die for-Schleife auch entfernen, wenn Sie nur ein Wort auf diese Weise verwenden.

meuh
quelle
Nicht genau das, was ich mir erhofft hatte, aber ich gebe es +1 für Kreativität
sa289