如何在bash历史记录中删除最后5行?

如何在bash历史记录中删除最后5行?这样当我重新加载Ubuntu服务器或重启它时,它们就不会再出现了。 history -c只会从当前会话中删除它们,但是当我重新登录时,我会再次看到这些命令,我想清除最后的5行。
我已经运行了:
history

然后我会看到命令的数字,例如:

  489  cd ..
  490  cd .zshrc
  491  cat .zshrc

然后我举个例子,我跑步。
history -d 489
history -c 

然后我关闭终端并重新打开,但我仍然看到第489行,它只是在当前会话中被删除了,如何永久地从所有会话中删除它?

历史文件不仅仅是一个可以编辑的简单的 .txt 文件吗?抱歉,我现在用的是 Windows,从未真正尝试过。 - EODCraft Staff
https://superuser.com/a/384378/74576 给我展示了如何从终端历史中删除任意行。 - Ryan
5个回答

你可以通过命令行实现从历史文件中删除的两个步骤来实现:
输入history -d <line_number>会从内存中删除指定的行。 输入history -w将当前的内存历史写入~/.bash_history文件。 这两个步骤一起将永久地从内存历史和.bash_history文件中删除该行。
来源:Super User - 从Bash历史文件中删除特定行

这个方法更接近了,所以我运行历史命令 -wd 493 作为示例,它可以完全删除它,但是然后在历史记录中会有一堆 history -wd 的命令等等... 所以这样并不直观,我该如何一次性清除最后的5个命令呢?这样会更好,还有我用来清除它们的实际命令。 - Anthony Pinto
有没有历史记录的帮助页面?抱歉,我在使用Windows系统。 - EODCraft Staff
1@EODCraftStaff 输入man和您想要查看的命令手册名称。在这种情况下:输入man history - L. D. James
在执行历史删除命令之前,在其之前加一个空格,这样在从历史记录中删除内容后,它就不会进入你的历史记录。或者,在完成后执行 kill -s 9 $$ 命令。 - Stephen
@AnthonyPinto 你应该考虑一下这个超级用户的问题:这个问题 - Cadoiz
我们还可以使用-d start-end来删除一个范围。另外,HISTCMD变量表示当前命令的历史编号或在历史列表中的索引。 - Pablo Bianchi

我觉得你需要试一下这个,它非常简单易懂。
如何删除历史记录而不留下任何痕迹:
1. 删除指定数量的历史记录: ``` history -d $((HISTCMD-1)) && history -d 要删除的历史记录数量 ```
2. 如果你想执行一个命令而不留下任何痕迹: ``` history -d $((HISTCMD-1)) && 输入你要执行的命令并执行 ```

1(2.)不回答问题,并在无痕命令前添加一个空格字符以避免将其添加到历史记录中会更容易。 - David Foerster
1(1.)是一个既优秀又优雅的解决方案。我不确定添加空格如何防止它被添加到历史记录中,David。 - theking2
4@theking2 对于一些系统,添加一个空格告诉bash不要将命令写入历史记录 https://stackoverflow.com/questions/6475524。 - chaptuck

有不同的方法来完成这个任务,但在继续之前让我们澄清一些事情。
有一个名为~/.bash_history的文件,其中包含您以前的终端会话历史记录,每当您关闭终端时,您的历史记录将保存在那里。
与此同时,您旧会话的历史记录以及当前会话的历史记录可以通过history命令临时访问,直到您关闭终端,然后将保存到~/.bash_history文件中。
因此,如果您删除~/.bash_history末尾的5行,那么关闭终端将导致您当前的命令在下一个会话中可访问。
所以,如果我对.bash_history执行wc命令:
wc -l ~/.bash_history

大多数时候,我得到的数字比history | wc -l少。
如果你想删除文件的最后5行,可以使用以下命令:
for i in {1..5}; do sed -i '$d' .bash_history; done;

如果你想保留所有历史记录,除了当前会话中最后5个命令之外,请运行以下命令:
history | awk '{ print $2 }' | head -n -5 > .bash_history

别忘了也运行 history -c


这会只删除bash中的最后5个命令吗?并且是永久性的吗?例如,当我关闭终端并重新登录到ssh时,最后5个命令不会存在? - Anthony Pinto
尝试在本地进行了翻译,但出现了"head: illegal line count -- -5"的错误提示。请提供要翻译的文本内容。 - Anthony Pinto
看起来有点奏效的是当我运行 history -wd 493 这样的命令时,它可以彻底删除它,然而,之后在历史记录中就会出现一堆以 history -wd 开头的命令...这样显得有些不合理。有没有办法一次性清除最近的5个命令,这样最好了,然后再用来清除它们的实际命令是什么呢? - Anthony Pinto
测试新代码。对我来说运行正常。 - Ravexina
仍然显示“头部:非法行数计数-- -5”。:( - Anthony Pinto
head --version 输出是什么? - Ravexina
[~]$head --version head: 非法选项 -- - 用法: head [-n 行数 | -c 字节数] [文件 ...] - Anthony Pinto
你正在运行哪个版本的Ubuntu? - Ravexina
噢,我先在本地进行测试,好的,如果我在Ubuntu上运行命令"history | cut -f4 -d' ' | head -n -5 > .bash_history",然后运行history -c,我也不会看到命令"history | cut -f4 -d' ' | head -n -5 > .bash_history",对吗? - Anthony Pinto
你不应该得到任何输出。它会读取你的历史记录,删除最后几行,然后将其写入.bash_history文件中。 - Ravexina
这样将删除最后5行,但仍会写入: "history | cut -f4 -d' ' | head -n -5 > .bash_history" 到 .bash_history 文件中?有没有办法删除最后5行,并且删除删除5行的命令呢?如果我们能做到这一点,那就万事俱备了! :) - Anthony Pinto
运行该命令后,使用 history -c。但在此之后不要再运行建议的命令,因为它会删除所有历史记录(在运行 history -c 后)。 - Ravexina
运行了这个命令:"history | cut -f4 -d' ' | head -n -5 > .bash_history" 它真的搞乱了历史记录,如果你关闭终端然后再打开终端查看历史记录,会发现一团糟,似乎没有按照预期的方式执行。它删除的内容远超过了5条。你能帮忙调查一下吗? - Anthony Pinto
让我们在聊天中继续这个讨论。 - Ravexina
@AnthonyPinto 我把答案改得更清楚了,我觉得值得一读,而且我在第二段代码中把cut改成了awk。 ;) - Ravexina
谢谢!:) 顺便问一下,你有没有从PostgreSQL数据库直接将数据转储到本地机器的经验?http://stackoverflow.com/questions/43334419/how-do-i-do-a-db-dump-from-server-to-local-machine-directly - Anthony Pinto
很抱歉,从未碰过它。 - Ravexina

1. 将当前历史记录写入历史文件,覆盖历史文件的内容
history -w
2. 根据需要编辑历史记录
vi ~/.bash_history
3. 读取历史文件的内容并将其用作当前历史记录
history -r

打开你的编辑器,然后在其中打开~/.bash_history文件,并删除最后5行。

对于VIM不是很擅长 - 我可以运行"history -wd 1","history -wd 2","history -wd 3","history -wd 4","history -wd 5",然后再运行"history -c"吗?那下次我打开时,这五个命令以及用于删除它们的会话命令都会消失吗? - Anthony Pinto
如果你想要隐藏命令历史记录,可以使用HISTIGNORE变量,例如在你的.bashrc文件中,设置HISTIGNORE='clear:history:ls:cd'。 - Nick Rodriguez
你可以使用 gedit ~/.bash_history,不必使用 vim 或 nano。 - EODCraft Staff