bash 기록에서 선택한 결과를 삭제하는 방법은 무엇입니까?


66

historycommand는 모든 결과를 보여 주지만를 사용하여 특정 명령을 얻도록 필터링 할 수 있습니다 history | grep searchingCommand. 정말 도움이됩니다.

그러나 문제는 오타로 입력되었거나 실패한 명령도 표시한다는 것입니다. 그렇다면 올바른 것을 식별하는 것은 실제로 고통입니다. 이 링크를 확인했습니다 : 터미널에서 선택적 명령 기록? 그러나 그것은 내 해결책이 아닙니다.

그렇다면 입력하거나 나중에 입력 할 때 올바르지 않은 기록에서 해당 명령을 삭제하는 방법이 있습니까?


5
허용 된 답변을 변경하십시오. 100 개 이상의 투표권이있는 다른 답변이 있습니다.
greuze

1
@greuze : 가장 좋은 답변으로 변경되었습니다. 투표 횟수가 최고라는 것을 의미하지는 않습니다!
Saurav Kumar

답변:


20

나는 bash로 작업 할 때 실수로 찾은 히스토리 항목을 수정 (또는 삭제)하는 다른 방법을 추가하고 싶습니다.

이를 설명하려면 bash에서 다음 세 명령을 실행하십시오.

$ echo 1
1
$ echo 2
2
$ echo 3
3

이제 화살표 키 또는 Ctrl+ pCtrl+를 사용하여 이러한 명령을 다시 선택할 수 있습니다 n.

처음 두 명령을 수정한다고 가정하십시오. 이 echo 1나타날 때까지 기록을 이동 하고로 변경 echo 1 - changed하되 ENTER를 누르지 마십시오. 이제 히스토리를 통해 더 이동하면이 라인은 수정 된 상태로 유지되며이 라인을 이리저리 이동할 수 있습니다. 이제 줄로 이동하여로 echo 2변경 echo 2 - changed하십시오. 다시 Enter 키를 누르지 마십시오. 이 행에 변경 사항을 저장하려면이 두 행을 제외한 모든 명령을 선택하고 Ctrl+를 누르십시오 c.

물론 기록 항목을 수정하는 대신 해당 기록 항목을 제거하여 해당 항목에 빈 줄이 생길 수도 있습니다. 현재 프롬프트에 표시된 행을 삭제하려면 Ctrl+ e(행의 끝으로 이동)를 누른 다음 Ctrl+ u(행의 시작에서 커서까지의 텍스트를 삭제 )를 누르십시오 .

자세한 내용은 https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 을 참조하십시오 . 기술적 배경.

가장 간단한 방법 :

  1. ctrl+ r삭제 / 수정하려는 명령을 검색합니다.
  2. end 검색된 명령을 선택하여 삭제 / 수정
  3. 선택한 명령을 삭제하거나 수정합니다 ( enter또는 ctrl+를 누르지 마십시오 c)
  4. 위쪽 화살표 (또는 ctrl+ p) 또는 아래쪽 화살표 (또는 ctrl+ n)를 사용하여 다른 명령을 선택하십시오.
  5. ctrl+ c 그게 다야!

참고 :

현재 세션 명령 만 변경합니다. 이전 명령을 변경하고 변경 사항을 저장하려면 터미널을 닫기 전에 다음 명령을 실행해야합니다.

history -w

많은 감사합니다 Stefan! 나는 당신이 멋진 것을 가져 왔다고 말해야합니다. 이것을 사용하여 기록을 수정 / 삭제하는 가장 간단한 방법을 찾았습니다. 1.ctrl+r 삭제 / 수정하려는 명령을 검색합니다. 2.end 명령을 이동하고 명령을 삭제 / 수정합니다. 3.ctrl+n 다음 줄로 이동 한 다음 4.ctrl+c
Saurav Kumar

144

사용하다:

history -d OFFSET

OFFSETbash 기록 파일에 추가되기 전에도 오프셋에서 기록 항목을 삭제 합니다. 권한을 찾으려면 명령 OFFSET만 실행하면됩니다 history. 삭제하려는 히스토리 항목이 포함 된 행의 시작부터 숫자입니다.

기록 사용에 대한 수정 사항을 저장하려면

history -w

이 안내서 에서 자세한 내용을 참조하십시오 .


새로운 방법을 얻을 나쁜 :) 잘하지 ..
Saurav 쿠마

10
@SauravKumar 나쁘지 않나요?!? 아마 가장 좋은 방법은 ...
Radu Rădeanu

5
먼저 읽으십시오 : 명확하게 history -w하기 위해 변경 사항을 저장하기 위해 사후에 해야합니다 . 또한 OFFSET은 history표시 되는 숫자를 의미 합니다. 삭제하려는 줄이 873이면을 사용하십시오 history -d 873.
Cammy_the_block

2
@ RaduRădeanu 사용 history -whistory -d변경 사항을 저장합니다.
Cammy_the_block 16

20
이것이 정답이어야합니다.
topher

19

파일을 편집하고 ~/.bash_history오타로 한 번 삭제

예를 들어 다음 명령을 삽입하십시오.

gedit ~/.bash_history

파일을 저장하고 터미널을 다시 시작하는 것보다 마음에 드는 것을 편집하십시오. 루트 명령은 다음과 같습니다

sudo -i 
inser your password
gedit ~/.bash_history

모든 것을 삭제하려면 history -c트릭을 수행해야합니다


통사론

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

-c 기록 목록을 지 웁니다. 히스토리 목록을 완전히 대체하기 위해 다른 옵션과 결합 될 수 있습니다.

-d offset 위치 오프셋에서 기록 항목을 삭제합니다. 히스토리가 표시 될 때 나타나는 오프셋을 지정해야합니다.

-a 새로운 히스토리 라인 (현재 Bash 세션 시작 이후 입력 된 히스토리 라인)을 히스토리 파일에 추가합니다.

-n 히스토리 파일에서 아직 읽지 않은 히스토리 라인을 현재 히스토리 목록에 추가하십시오. 이것은 현재 Bash 세션이 시작된 이후 히스토리 파일에 추가 된 행입니다.

-r 현재 기록 파일을 읽고 내용을 기록 목록에 추가합니다.

-w 현재 기록을 기록 파일에 기록합니다.

-p 결과를 히스토리 목록에 저장하지 않고 args에서 히스토리 대체를 수행하고 결과를 표준 출력에 표시합니다.

-s 인수는 히스토리 목록의 끝에 단일 항목으로 추가됩니다.

출처 :


감사합니다 도움이되었습니다! 명령 행에서 입력 할 때 항목을 삭제하는 방법을 알고 있습니까? 또는 .bash_history? 를 열지 않고 항목을 삭제하는 명령이 있습니까?
Saurav Kumar

1
@ bladed19899 history -c가 작동하지 않습니다. 터미널을 닫았다가 다시 열면 기록이 삭제되지 않습니다. -1 답변
αғsнιη

1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. 소스
blade19899

2
@KasiyA 사용 history -whistory -c변경 사항을 작성합니다.
Cammy_the_block

16

동일한 터미널에서 즉시 삭제하려면 ~ / .bashrc 파일에 다음을 추가해야합니다.

PROMPT_COMMAND='history -a' 

그리고 다시 시작 터미널을.

.bashrc 파일의 어느 위치 에나 추가 할 수 있습니다. 다른 기록 관련 항목과 함께 아래와 같이 추가했습니다.

여기에 이미지 설명을 입력하십시오

일반적으로 bash 세션 중에는 세션이 종료 될 때까지 실행 된 명령이 .bash_history에 기록되지 않으므로 PROMPT_COMMAND='history -a'명령을 입력 한 다음 .bash_history에 입력합니다.

이제 명령에서 실수 나 오류가 발생하여 삭제하고 싶을 때마다 다음을 실행하십시오.

sed -i '$d' ~/.bash_history

tada가 삭제됩니다.

더 간단하게 만들려면 더 간단한 것으로 별칭을 지정하고 다음과 같이 사용하십시오.

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

따라서 실행 rh하면 기록에서 마지막으로 실행 된 명령이 제거됩니다.

위의 내용은 세션에 대해서만 지속되는 임시 앨리어싱입니다.

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

.bashrc로

노트

양쪽에 공간이 없어야합니다 =

별명을 원하지 않으면 다음을 수행 할 수도 있습니다.

commad 이름을 확인 rh하고에 배치 /bin디렉토리 :

  • 파일을 열고 rh다음 코드를 붙여 넣고 저장하고 닫습니다.

    sed -i '$d' ~/.bash_history

  • rh실행 파일을 만들어 /bin디렉토리 에 넣으십시오.

     chmod + x rh
     sudo cp rh / bin 
  • 이제 rh명령을 사용 하여 기록에서 최근 명령을 삭제하십시오.


파일 PROMPT_COMMAND='history -a'에서 어디에 추가 .bashrc합니까? 정확히 어떻게할까요? 나는 시도 sed -i '$d' ~/.bash_history는 편집없이 일하고있어 .bashrc! 그러나 별명은 작동하지 않습니다. 당신이 내 질문을 정교하게하고 별명을 작동 시키면 대답을 받아 들일 것입니다 .. :)
Saurav Kumar

@SauravKumar가 답을 편집했습니다. 앨리어싱 명령에서 작은 따옴표와 큰 따옴표를 놓쳤다 .. 나의 나쁜 .. : P
Stormvirux

믿거 나 말거나 .. 별칭이 여전히 작동하지 않습니다 .. 오류없이 실행되지만 .bash_history파일 에서 항목을 삭제하지 않습니다 . : : P 어떤 식 으로든 .. 문제는 없습니다 .. 나만의 명령을 내렸다가 /bin예배 규칙서. 당신의 명령 때문에 : sed -i "$d" ~/.bash_history그것은 잘 작동합니다. 나는 당신의 대답을 받아들입니다 .. :)
Saurav Kumar

마음에 들지 않으면 다른 사람들에게 도움이되도록 답변을 편집하고 싶습니다 ..
Saurav Kumar

실제로 나는 그것을 편집했다. 당신은 그것을 승인했습니다 ..
Saurav Kumar

2

여러 줄을 제거하려면 (예 : 1974 년부터 1990 년까지, history명령으로 확인 ) :

  for i in `seq 1974 1990` ; do history -d 1974 ; done

제거 할 줄 번호는 해당 줄 번호를 계속 제거하고 다음 줄로 갈 때와 항상 같습니다.


메모는 매우 중요합니다.
Weijun Zhou

1

bash에서 "set -o vi"옵션을 사용하는 경우 (Escape 키를 사용하여 다시 검색하는 데 매우 유용) "vi"에서와 동일한 방식으로 줄을 검색하고 "dd"를 사용하여 줄을 삭제할 수 있습니다.


역사에서 명령을 실제로 지우려면 입력 j하거나 k후에 입력해야한다는 것을 알았 dd습니다. 다른 명령을 입력 Enter하거나을 누르면 bash는 새 명령 일 뿐이며 이전 명령을 기록에 유지해야한다고 가정합니다. 또한 올바르게 수행되면 명령이 지워지지 만 삭제되지는 않습니다. 결과는 빈 기록 항목입니다. 그러나 이것은 명령 줄에 입력 해야하는 암호를 제거하기에 충분하며 다른 답변보다 훨씬 쉽습니다.이를 게시 해 주셔서 감사합니다!
Michael Scheper 2018 년

0

나는 Yubikey의 아마도 50 정도 정도의 bash 기록에 불필요한 항목이 있었으며 'ccccc .....'와 일치하는 상황이있었습니다. 이상적으로는 패턴과 일치하는 항목을 삭제하는 방법을 원했습니다. 기록이 공백을 무시한다고 가정하면 sed 또는 무언가로 할 수 있다고 가정합니다.

어쨌든, 나는 게으르고 vim을 사용하여 'cccc'를 검색하고 모든 경기를 순환하면서 'dd'를 사용했습니다. 1 분 이상 걸리지 않았습니다.


1
vim 에서이 작업을 수행하는 경우 : g / cccc / d 또는 : g / ^ cccc / d :를 수행하거나 매크로 qqnddq를 사용한 다음 @@을 사용할 수 있습니다 (마지막 검색은 ccccc라고 가정).
htaccess

@htaccess 확실히 쉬웠지만, 나머지 파일을 동시에 시각적으로 검사하고 싶었습니다.
Dylan_Larkin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.