Bash - 増分履歴検索(ctrl + r) - 隣接していない複数の単語を一致させる

Bash - 増分履歴検索(ctrl + r) - 隣接していない複数の単語を一致させる

Ctrlbash履歴を検索するために+を使用するRときに隣接していない2つの単語を一致させる方法はありますか?たとえば、を含むhttpdが隣接していないawk最後のコマンドを探したいとします。 bashの履歴をgrepingして両方を一致させるか、Ctrl+を押して目的のコマンドが見つかるまでキーワードに一致する項目を循環するよりもR優れたオプションはありますか?

答え1

バッシュリファレンスマニュアル説明する:

Readlineは、指定された文字列を含む行のコマンド履歴を取得するコマンドを提供します。

固定文字列ではなく正規表現が必要です。

努力するハースト:
1.インストールする
2.構成

次のような内容が表示されますhstr
ここに画像の説明を入力してください。

修正する
もう一つのツール富士

  1. インストールする: git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install

  2. リソースの再割り当て~/.bashrc:source ~/.bashrc

次のような内容が表示されますfzfここに画像の説明を入力してください。

答え2

これを行う組み込みの方法はわかりませんが、grepを実行して履歴ファイルを編集して結果を最後に表示する小さな関数を作成できます。次に、簡単に一致するものを選択して新しい歴史に追加します。進み続けます。 (これにより、履歴のコマンド順序が変わります。)

こんな機能ですね。私はあなたが現れる順序に関係なく2つ以上の単語を探したいとします。許容される最大一致数は10個です。また、最初のgrepが大きな文字列を返さないか、bash文字列の代わりに一時ファイルを使用する必要があるとします。

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
}

単語に対して正規表現パターンマッチングを実行したくない場合は、grep の代わりに fgrep を使用します。特定のシーケンスのみが必要な場合は、「httpd.*awk」などの単一の単語を使用してください。この方法で1つの単語しか使用されていない場合は、forループを削除することもできます。

関連情報