나는 종종 다음과 같은 일을 하면서 내 역사를 검색하고 있는 나 자신을 발견합니다.
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,+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() {
# ...
}