기록 파일을 greping할 때 고유 명령의 마지막 줄 번호를 얻는 방법은 무엇입니까?

기록 파일을 greping할 때 고유 명령의 마지막 줄 번호를 얻는 방법은 무엇입니까?

나는 이전 명령, 특히 길고 매개변수가 많은 명령의 기록 파일에 의존합니다. 명령과 해당 줄 번호( )를 찾으면 nn이를 사용하여 !nn실행합니다. 나는 인라인 역방향 검색을 수행하는 것보다 검색의 전체 출력을 보는 것을 선호합니다.

이를 위해 나는 검색을 통해history | grep some_text

하지만 중복된 항목으로 인해 출력이 많이 발생하는 경향이 있습니다(줄 번호만 다름). 내 역사가 성장함에 따라 시간이 지남에 따라 상황이 더욱 악화됩니다.

!호출 명령 연산자와 함께 사용할 수 있는 고유 명령 목록을 어떻게 얻을 수 있습니까 ?

나는 역사 | uniqlo | grep some_text를 시도했지만 줄 번호 때문에 작동하지 않습니다.

이 작업을 수행 history | cut -b8- | uniq하고 명령만 표시할 수 있습니다.
그런데 추가하면 5359 \253' sort가 나오며 줄번호도 없어져요, 정말 원하는 명령어 네요$ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were5360 x'.
!line-number

이상적으로는 제가 일을 할 때마다 이런 일이 일어나기를 바랍니다 history | grep. 저는 많은 일을 하고 있고 별칭이 있어서 hg='history | grep '어떤 솔루션이든 추가할 수 있습니다.

덜 이상적이지만 여전히 흥미로운 점은 실제로 기록 파일 항목을 고유하게 만드는 임시 프로그램을 실행하여(역시 줄 번호 문제를 처리하여) 주어진 명령에 대한 가장 최근의 기록 명령만 유지하는 기능입니다. 아마도 다른 줄을 삭제하면 될 것 같습니다. 그러나 이런 방식으로 기록 파일에서 행을 삭제하면 시스템이 파일을 사용하는 방식이 중단됩니까?

답변1

당신은 말할 수 있습니다 :

history | awk '{$1=""; sub("^ ", "", $0)}1' | sort -u

에서 고유 항목 목록을 가져옵니다 history.

HISTCONTROL그러나 중복을 방지하도록 설정할 수도 있습니다 history.

HISTCONTROL=ignoredups:erasedups

에서 인용수동:

HISTCONTROL

명령이 기록 목록에 저장되는 방식을 제어하는 ​​콜론으로 구분된 값 목록입니다. 값 목록에 " ignorespace"가 포함되어 있으면 공백 문자로 시작하는 줄은 기록 목록에 저장되지 않습니다. 값이 " ignoredups"이면 이전 기록 항목과 일치하는 행이 저장되지 않습니다. " " 값은 " " 및 " " ignoreboth의 약어입니다 . 값이 " "이면 현재 행과 일치하는 모든 이전 행이 행을 저장하기 전에 기록 목록에서 삭제됩니다. 위 목록에 없는 값은 무시됩니다. 설정되지 않거나 유효한 값이 포함되지 않은 경우 셸 파서가 읽은 모든 줄은 값에 따라 기록 목록에 저장됩니다 . 여러 줄 복합 명령의 두 번째 및 후속 줄은 테스트되지 않으며 값에 관계없이 기록에 추가됩니다 .ignorespaceignoredupserasedupsHISTCONTROLHISTIGNOREHISTCONTROL

답변2

.bash_history명령을 사용하는 대신 파일을 구문 분석할 수 있습니다 history. 예는 다음과 같습니다 awk.

awk '!x[$0]++' .bash_history | nl

그러나 @devnull의 답변과 마찬가지로 HISTCONTROL중복을 피하기 위해 명령과 다음으로 시작하는 명령을 사용해야 합니다 spaces.

HISTCONTROL=ignoreboth

답변3

내 시스템에는 uniq필드를 건너뛰는 옵션이 있습니다.

history | uniq -f 1

줄 번호가 포함된 고유한 기록 목록을 제공합니다.

내 버전:

uniq (GNU coreutils) 8.15

그러나 이는 동시 중복을 무시하므로 실제로 기록 출력을 정렬한 다음 다음을 수행합니다 uniq.

history | sort -k 2 | uniq -f 1 | sort -n

마지막 정렬은 선택 사항이며 정렬된 고유 항목을 명령 번호별로 재정렬합니다.

관련 정보