検索履歴と指定されたウィンドウサイズの時間的コンテキストを取得する

検索履歴と指定されたウィンドウサイズの時間的コンテキストを取得する

私はしばしば次のことをしながら自分の歴史を探している自分自身を見つけます。

history | grep searchterm

searchtermこれにより、コマンドで使用したすべての時間のリストが返されます。ところで、私はしばしば気になります。N前のコマンドとこのコマンドの前後に入力する次のコマンドには、が含まれていますsearchterm。コマンドを実行するコンテキストはしばしば非常に便利です。

私がしたいことは

> history-search-context searchterm n m

入力された別のコマンドのリストを取得します。Nそして前のコマンドを含む履歴項目の後のコマンドsearchterm

例:

> history-search-context mycommand 2 1

687 cd some/directory
688 ls -a
689 mycommand -flag arg1
690 touch file
-------------
943 apt-get install something
944 pwd
945 mycommand -otherflag arg1 arg2 arg3
946 rm file

これはmycommand、記録された履歴でいくつかの興味深いフラグとパラメータを2回使用し、[-2、+ 1]コマンドウィンドウ内で一度はコマンドを実行してファイルをsome/directory生成する必要があり、別のときはそれをインストールし、something私が持っていたディレクトリを確認しました次を削除しましたfile

これを行う既存の方法はありますか?そうでない場合、これを達成する方法は何ですか?

答え1

grep(GNU)grepには「前と後の一致行」オプションが自然に設定されているので、ヘルパー関数を使用してこれを処理します。簡単なバージョンは次のとおりです。

histgrep() {
  history | grep -B $2 -A $3 "$1"
}

...上記の履歴検索コンテキストコマンドのように使用できます。

$ histgrep jeff 1 1

  517  vi go.sh
  518  x=jeff
  519  y=/tmp
--
  832  sudo visudo
  833  sudo adduser jeff2
  834  man sudoers
--
  841  sudo ls -al /var/lib/sudo/lectured
  842  sudo rm /var/lib/sudo/lectured/jeff /var/lib/sudo/lectured/schaller
  843  sudo ls
--
  940  ls *[[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]]*
  941  touch jeff߄߅߆߇߈߉.txt
  942  ls
--
 1235  histgrep a b c
 1236  histgrep jeff a 1
 1237  histgrep jeff 1 a
 1238  histgrep jeff 1 1

いくつかの基本的なエラーチェックを追加すると、関数は次のようになります。

histgrep() {
  if [ "$#" -ne 3 ]
  then
    echo "Usage: histgrep searchterm n-before m-after"
    return
  fi
  case "$2$3" in
  (*[^0-9]*)
        echo "Usage: histgrep searchterm n-before m-after"
        return
        ;;
  esac
  history | grep -B $2 -A $3 "$1"
}

必要に応じて、history-search-context代わりに簡単に名前を付けることができます。histgrep

history-search-context() {
# ...
}

関連情報