如何从history的数据库中删除某行?

#1 楼

您需要注销并重新登录或运行history -a,以便将当前历史记录提交到磁盘。

然后只需编辑文件~/.bash_history

评论


如果设置了HISTFILE环境变量,则历史记录文件不是〜/ .bash_history,而是$ {HISTFILE}。

– Karolos
13年4月3日在22:34

退出外壳程序时,会将条目写入历史文件。因此,输入要删除的命令后,您需要注销并重新登录,或使用'history -d xxxx'将其从当前Shell会话中删除。

–有害
2014年1月24日,0:19

但是如何删除历史文件的记录呢?

– chiliNUT
14年7月23日在19:54

@chiliNUT:只需使用空格启动命令(例如vim〜/ .bash_history);以空格开头的命令通常不会被记录(请参阅$ HISTCONTROL)。

– Cyrus
14年7月23日在20:34

我认为发行中的情况并非如此,但总的来说这是有道理的

– chiliNUT
2014年7月23日在22:29



#2 楼

您可以通过以下两个步骤使用命令行从历史记录文件中删除:


键入history -d <line_number>会从内存中的历史记录中删除指定的行。内存历史记录到history -w文件。

这两个步骤一起从内存历史记录和.bash_history文件中永久删除该行。

评论


如何从历史记录中删除最后一个历史记录-w?

– Midhun KM
2015年3月5日,9:01

@KrIsHnA手动编辑〜/ .bash_history

–亚历山大·米肖夫(Alexander Myshov)
15年5月23日在6:51

或者在它前面添加一个空格以防止添加它,如@tao的答案

–马克
15年8月18日在8:28



要查找只是历史记录| grep [unwanted_content]获取包含所有包含[unwanted_content]的行的列表(如密码)。

– AvL
17年9月18日在15:23

如何删除多行(特定)(按ID)?

– Pathros
18年6月19日在17:38

#3 楼

为了避免首先将命令添加到历史记录中,请确保环境变量HISTCONTROL在其冒号分隔的值中包含值ignorespace,例如(例如,添加到.bashrc):
$ export HISTCONTROL=ignorespace


这将防止将任何带有前导空格的命令添加到历史记录中。然后,您可以通过运行

$  history -c -w
  ^-- additional space character

彻底清除历史记录

#4 楼

首先,如果您要发出的命令是敏感的,不安全的,或者您只是不需要它使您的历史记录变得混乱,那么最好/最快地只是阻止它首先输入历史记录。确保$HISTCONTROL包含ignorespace: br />
如果您不小心在历史记录中添加了不需要的命令,而您的bash会话仍处于打开状态,则该命令尚未触及磁盘。要删除历史记录中的前一个命令,请发出:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace


注意前导空格;此命令需要ignorespace,否则将自行删除!

如果要删除最后几个命令,请找到最后一个和第一个历史记录编号: />
,在这种情况下为602和599。然后发出:
如果您不希望当前会话中的任何历史记录进入磁盘,请使用以下命令退出:敏感的历史记录项将写入磁盘以提高安全性,因为从理论上讲,从非易失性介质中删除的数据仍然可以恢复。

如果要删除的命令来自在上一个会话中,它们将在退出时被附加到ignorespace上。使用上述命令操作历史记录仍将仅在退出时将剩余的新项目附加到$HISTFILE。要以当前会话的整个历史记录视图覆盖$HISTFILE,请立即发出:使用$HISTFILE命令的历史记录,然后发出history -d,是使用文本编辑器编辑history -w

评论


“使用上面的命令来操作历史记录,仍然只会在退出时将其余的新项追加到$ HISTFILE中。”实际上,这并非完全正确。似乎只追加了从原始历史记录长度中“伸出”的其余新项目。例如。如果我删除了5个原始项目并添加了15个新项目,那么仅会附加最后10个新项目,而我希望所有15个新项目都会被添加。我认为这是一个错误,因为我看不到这是多么理想的功能。

–詹姆斯·海格(James Haigh)
2013年6月19日15:59

我猜bash记录了原始长度。在会话关闭时,它可能会附加数量大于此值的项目。如果每次删除数量小于或等于此值的项目时此值都会减小,则它将按预期工作。 ;-)

–詹姆斯·海格(James Haigh)
2013年6月19日16:06

#5 楼

几种技术:

防止敏感信息存储在历史记录文件中

如果您在命令行上输入了一些密码,然后意识到所有命令都已记录下来,可能之一:



不保存历史记录而直接退出当前会话:

 kill -9 $$


这将删除所有当前历史记录。

在打开的bash会话中键入↑(向上箭头),直到显示敏感信息,然后使用Ctrl + W等行编辑键删除敏感信息,然后使用↓(向下箭头)直到提示新的空行,然后再键入Enter。它,但不是全部历史记录:

一个简单的sed命令就可以完成这项工作:创建另一个包含搜索模式的历史记录行(敏感信息),您正在尝试删除。因此您可以:

sed -e '/SeNsItIvE InFo/d' -i .bash_history


这将在终端输入的情况下运行head -n1
您的终端似乎已挂起(提示);
只需键入要从文件中删除的信息即可。
这是一个让您输入命令(一部分)而无需在命令行中实际键入信息的技巧,
,因此它不适合包含在历史记录中。 :如果您的敏感信息模式包含斜杠,则必须用反斜杠将其转义,或者更改sed命令以使用此语法
,以指定一个不出现在模式:

sed -e "/$(head -n1)/d" -i .bash_history


另一种方法是仅删除敏感信息,但保留包含该信息的命令。为此,您可以简单地将敏感信息替换为您选择的替代文本:

sed -e "\|$(head -n1)|d" -i .bash_history


从特定树中的任何文件中删除敏感信息。 >最后,确保不会保留在另一个被遗忘的文件中:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.


将列出所有相关文件。 br />
将替换以.bash_history为根的目录树中所有文件中所有敏感信息的出现。名称中包含换行符的文件。

评论


结合相关答案中的技巧,应该有可能删除SeNsItIvE InFo和使用sed -e'/ SeNsItIvE InFo / d'-i .bash_history之类的sed命令在同一行进行删除。历史-d $(((HISTCMD-1))

– S0AndS0
19年11月2日在4:25

#6 楼

通过按↑(向上箭头)找到要删除的行,直到它出现,然后按Ctrl + U。那应该删除该行。

如果使用history命令,则可以看到该行已被星号替换。

评论


实际上,我认为您必须将光标向上移至该行,按Ctrl + U,然后向上或向下光标至另一行(可能在列表底部为空白)。另外,严格来说,该行还没有被星号代替。而是,该命令已被删除,并且历史记录号后面带有*。

– G-Man说“恢复莫妮卡”
2015年4月1日于16:47

借助Ctrl + R(反向增量历史记录搜索),此功能将变得更加强大,例如[结束],Ctrl + U

–sehe
2015年6月15日12:13



#7 楼

如果需要同时删除多行,我通常使用以下命令:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " }'


如果需要删除最后一条命令,可以使用:

history -d $((HISTCMD-2))


评论


这看起来像是可行的,但是历史| grep 仍然显示它声称要删除的所有行...

–布鲁克·亨斯利(Brock Hensley)
13年4月19日在0:09

删除第一行后,这将删除错误的历史记录行!

–米克
2013年12月20日下午14:51

但幸运的是,它仅输出错误的删除命令。下面将显示正确的删除命令: grep XYZ | grep -v grep | TAC | awk'{print“ history -d”,$ 1}'

– mivk
2013年12月20日15:17



#8 楼

如果您需要从历史记录中删除一系列行,则以下bash函数可以为您节省一些时间:要立即使用该功能,您需要运行的shell($HOME/.bashrc)再次读取该文件。然后删除例如历史记录中的命令200-210:

function histdel() {
    [ $# -eq 1 ] && history -d "" && history -w
    if [ $# -eq 2 -a "" -le "" ]; then
        for n in `seq "" ""`; do
            history -d "$n"
        done
        history -w
    fi
}


(注意:如果您从bash历史记录中删除一系列命令,则此问题是搜索结果中排名最高的一个。尽管以上内容不只是问题的要问,但对某些读者可能有用。

评论


for语句的替代形式:$ {seq“ $ 2”“ $ 1”)中的n在某些方面在样式上是首选,如果seq不起作用,则尝试(((n =“ $ 2”; n> =“ $ 1 “; n--))。

–斯科特
13年13月13日在18:11

#9 楼

history | sed -i 59d


59是行号。没有比这更甜的东西了:)

#10 楼

只需尝试一下,

$ history


,这将显示历史记录的ID和命令,例如




211 ls
212 javac Welcome.java
213 java welcome




使用,

$ history -d 211


这里211是历史记录的ID。现在使用

$ history





211 javac Welcome.java
212 java welcome




#11 楼

我知道问和回答这个问题已经有很长时间了,但是我将向您展示清除历史文件并同时注销的方法。

我运行:
history -w && nano "${HISTFILE}" && history -c && exit

它的作用很简单: > history -w:请允许我编辑"${HISTFILE}"。您可以使用sed脚本或任何您想清理的nano "${HISTFILE}"。 >
"${HISTFILE}":注销并附加缓存的历史记录...,但是为空;)

执行该命令后,将使用干净的历史记录文件注销。登录以查看您的历史记录;)

希望对您有所帮助。

#12 楼

您还可以直接编辑历史记录文件,例如,如果您在bash shell中,请编辑nano .bash_history