.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
불필요한 선을 대부분 제거하는 간단한 필터를 추가해 보세요.
제한 요소가 전체 기록을 인쇄하는 데 걸리는 시간인 경우 history
grep(또는 다른 필터)에 의해 선택된 기록 부분을 인쇄하는 해킹이 있습니다. 사용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 cd
220줄이 넘는 코드가 생성되었지만 함수의 첫 번째 버전은 완료하는 데 약 0.004초밖에 걸리지 않았고 두 번째 버전은 완료하는 데 약 0.004초밖에 걸리지 않았습니다.
답변3
때로는 달릴 수도 있습니다 history >~/.zsh_history.cache
. 그런 다음 해당 파일과 history
파일에서 누락된 명령의 출력을 grep할 수 있습니다 .
나는 zsh
그것에 익숙하지 않기 때문에 파일 내용을 명령 출력과 결합하는 코드를 제공할 수 없습니다.
답변4
ripgrep을 시도해 볼 수 있습니다(https://github.com/BurntSushi/ripgrep)은 실제로 더 빠르며 유용한 필터링 옵션이 많이 있습니다. github 페이지에는 긴 기능 목록이 있습니다.
이는 많은 배포판의 저장소에 있습니다.