대규모 기록 기록에 대한 grep 속도를 높이는 방법은 무엇입니까?

대규모 기록 기록에 대한 grep 속도를 높이는 방법은 무엇입니까?

.zsh_history현재 10,000개의 행이 무제한입니다 . 특정 문자열(예: )이 있는 모든 명령을 기록에서 보고 싶은 경우가 많습니다 curl. 이렇게 history | grep curl하면 grep curl ~/.zsh_history속도가 훨씬 빨라지지만 형식이 손상됩니다(타임스탬프는 날짜로 구문 분석되지 않고 구분 기호는 기호로 유지됩니다).

느린 파이프 전송 history문제를 해결할 수 있는 방법이 있습니까 grep? 사람들이 Ctrl+R을 추천하는 것을 본 적이 있지만 분명히 같은 것은 아닙니다. grep은목록Ctrl+R은 한 번에 하나의 명령을 표시합니다. 또한 grep에 대한 파이핑을 사용하면 여러 grep 필터를 연결할 수 있지만 Ctrl+R을 사용하면 동일한 작업이 불가능합니다.

답변1

첫째, grep보다 더 복잡한 작업을 수행하지 않는 경우 제한된 일치가 history -m PATTERN아마도 grep보다 빠를 것입니다. 나중에 복잡한 필터를 적용하더라도 -m불필요한 선을 대부분 제거하는 간단한 필터를 추가해 보세요.

제한 요소가 전체 기록을 인쇄하는 데 걸리는 시간인 경우 historygrep(또는 다른 필터)에 의해 선택된 기록 부분을 인쇄하는 해킹이 있습니다. 사용fc -p새 기록 레코드를 시작하고 기록의 선택된 부분을 읽도록 합니다. 테스트되지 않음:

function format_history {
  fc -p -a =(cat)
  fc -l 1
}
history 1 | grep curl | format_history

이는 사용하기 매우 편리하지 않습니다(파이프 양쪽에 무언가가 필요하므로 접두사만 가질 수는 없습니다 magic_history_filter). 고급 파이프를 사용하고 임시 파일을 사용해야 하므로 전체 기록을 형식화하지 않음으로써 얻는 속도가 손실될 수 있습니다(zsh는 파이프 레코드가 아닌 검색 가능한 파일에서만 기록을 읽을 수 있습니다).

답변2

다음은 전체 기록에서 모든 문자열을 빠르게 검색할 수 있는 간단한 기능입니다.

histgrep() {
  fc -lm "*${1}*" 1 -1
}

더 빠른 속도:

histgrep() {
  zmodload -i zsh/parameter
  print -raC2 ${(kv)history[(R)*$1*]}
}

이들 중 하나는 각 라인 앞에 히스토리 라인 번호를 출력하므로 실행에 필요한 라인을 사용할 수 있습니다 !<number>. 예를 들어, 기록 줄 번호 2596을 명령줄에 삽입하려면 다음을 수행합니다.

!2596

Tab그런 다음 또는 를 누릅니다 Enter.

약 3400줄의 내역이 있습니다. 나에게는 이렇게 하면 histgrep cd220줄이 넘는 코드가 생성되었지만 함수의 첫 번째 버전은 완료하는 데 약 0.004초밖에 걸리지 않았고 두 번째 버전은 완료하는 데 약 0.004초밖에 걸리지 않았습니다.

답변3

때로는 달릴 수도 있습니다 history >~/.zsh_history.cache. 그런 다음 해당 파일과 history파일에서 누락된 명령의 출력을 grep할 수 있습니다 .

나는 zsh그것에 익숙하지 않기 때문에 파일 내용을 명령 출력과 결합하는 코드를 제공할 수 없습니다.

답변4

ripgrep을 시도해 볼 수 있습니다(https://github.com/BurntSushi/ripgrep)은 실제로 더 빠르며 유용한 필터링 옵션이 많이 있습니다. github 페이지에는 긴 기능 목록이 있습니다.

이는 많은 배포판의 저장소에 있습니다.

관련 정보