如何从bash历史记录中删除所选结果?


66

history命令显示所有结果,但我们可以使用进行过滤以获取特定命令history | grep searchingCommand。这真的很有帮助。

但是问题在于它还显示了那些输入错误或输入失败的命令。然后找到正确的人真是一件痛苦的事。我检查了以下链接:终端中的选择性命令历史记录?但这不是我的解决方案。

那么,有什么方法可以从历史记录中删除那些在输入的时间或更晚的时间不正确的命令?


5
请更改接受的答案,还有其他人的票数超过100。
greuze

1
@greuze:更改为最佳答案。计票并不意味着它是最好的!
Saurav Kumar '18

Answers:


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-c​​an-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726,以获取更详细的说明技术背景。

最简单的方法:

  1. ctrl+ r搜索您要删除/修改的命令。
  2. end 选择要删除/修改的搜索命令
  3. 删除或修改所选命令(不要按enterctrl+ c
  4. 向上箭头(或ctrl+ p)或向下箭头(或ctrl+ n)以选择任何其他命令。
  5. ctrl+就c 这样!

注意事项

这仅更改当前会话命令。如果要更改较旧的命令并保存更改,则需要在关闭终端之前运行以下命令:

history -w

非常感谢Stefan!我必须说,您带来了很棒的事情。通过这种方式,我找到了最简单的修改/删除历史记录的方法:1.ctrl+r搜索要删除/修改的命令。2.end移动命令并删除/修改命令。3.ctrl+n要到下一行,然后 4ctrl+c
Saurav库马尔

144

采用:

history -d OFFSET

删除偏移量的历史记录条目,OFFSET甚至在将其添加到bash历史记录文件之前。要找到正确的权限OFFSET,您只需要运行history命令。它是从行首开始的数字,其中包含要删除的历史记录条目。

并保存对历史记录的修改,请使用:

history -w

请参阅本指南中的更多详细信息。


不坏:)祝你得到一个新的方式..
Saurav库马尔

10
@SauravKumar还不错吗?!?可能是最好的方法……
RaduRădeanu2014年

5
首先阅读:为清楚history -w起见,您必须做后言以保存更改。另外,OFFSET表示要history显示的数字。如果您要删除的行是873,请使用history -d 873
2014年

2
@RaduRădeanu使用history -w之后history -d保存更改。
Cammy_the_block

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偏移量删除位置偏移处的历史记录条目。显示历史时,应指定偏移量。

-a将新的历史记录行(自当前Bash会话开始以来输入的历史记录行)添加到历史记录文件。

-n将尚未从历史文件中读取的历史行追加到当前历史列表中。这些是自当前Bash会话开始以来附加到历史文件的行。

-r读取当前历史记录文件,并将其内容附加到历史记录列表。

-w将当前历史记录写到历史记录文件中。

-p在args上执行历史记录替换,并在标准输出上显示结果,而不将结果存储在历史记录列表中。

-s args作为单个条目添加到历史记录列表的末尾。

来源


谢谢,这是有帮助的!从命令行输入时,您知道如何删除该条目吗?还是有任何命令在不打开的情况下删除条目.bash_history
Saurav Kumar 2013年

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

注意

两侧不应该有任何空间 =

如果您不想使用别名,也可以执行以下操作

命名一个通用名称rh并将其放置在/bin目录中:

  • 打开说一个文件rh并粘贴以下代码,然后保存并关闭:

    sed -i '$d' ~/.bash_history

  • 使rh可执行文件并将其放置在/bin目录中:

     chmod + x rh
     须藤cp rh / bin 
  • 现在使用rh命令从历史记录中删除最近的命令。


当添加PROMPT_COMMAND='history -a'.bashrc文件?究竟会做什么?我尝试了sed -i '$d' ~/.bash_history它,无需编辑即可正常工作.bashrc!但是别名问题不起作用..如果您只是阐述我的问题并使别名起作用,我将接受您的回答.. :)
Saurav Kumar 2013年

@SauravKumar已编辑答案。曾错过别名命令中的单引号和双引号。.我的错..:P
Stormvirux

信不信由你..别名仍然无法正常工作。.它可以正常执行,但不会从.bash_history文件中删除该条目..:P不会有任何问题..我做了自己的命令并将其放入/bin目录。由于您的命令: sed -i "$d" ~/.bash_history它工作正常。我接受您的回答.. :)
Saurav Kumar

如果你不介意的话,我想编辑您的答案,以便它可帮助他人..
Saurav库马尔

其实我是编辑过的。你已经批准它..
Saurav库马尔

2

删除多行(例如,从1974年到1990年,使用history命令检查):

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

请注意,要删除的行号始终相同,因为您要不断删除该行并转到下一个。


注释非常重要。

1

如果您在bash中使用“ set -o vi”选项(对使用Escape键进行搜索非常有用),则可以像在“ vi”中一样搜索行并使用“ dd”删除该行。


我发现我必须键入jk之后dd才能使其实际上从历史记录中清除命令。如果我键入另一个命令,或者只是按Enter,bash似乎假定它只是一个新命令,并且应该在历史记录中保留旧命令。有趣的是,注意正确完成后会清除命令,但不会删除-结果是空白的历史记录条目。但这足以删除我被迫在命令行中键入的密码,并且比其他答案容易得多,因此非常感谢您发布此密码!
Michael Scheper

0

我遇到过这样的情况,我的bash历史记录中有来自Yubikey的多余条目-大概50个左右,匹配“ ccccc .....”。理想情况下,我想要一种删除与模式匹配的条目的方法,假设您的历史记录忽略了空白,我想您可以使用sed或类似的方法。

无论如何,我很懒惰,最终使用vim,在每次比赛中都搜索“ cccc”并使用“ dd”。不到一分钟。


1
如果您是在vim中执行此操作,则还可以执行:g / cccc / d或:g / ^ cccc / d:或使用qqnddq宏,然后使用@@(假设您上次搜索的是ccccc)。
htaccess

@htaccess肯定会更容易,但是我有点想同时目视检查文件的其余部分。
Dylan_Larkin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.