私はしばしば次のことをしながら自分の歴史を探している自分自身を見つけます。
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() {
# ...
}