검색 기록 및 지정된 창 크기에 대한 시간적 컨텍스트 가져오기

검색 기록 및 지정된 창 크기에 대한 시간적 컨텍스트 가져오기

나는 종종 다음과 같은 일을 하면서 내 역사를 검색하고 있는 나 자신을 발견합니다.

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() {
# ...
}

관련 정보