Contents

如何删除最后n个命令的历史记录?

1. 概述

当我们在 Linux 下使用命令行时,最近的命令将保存在history 中。在本教程中,我们将介绍从history中删除一系列行的不同方法。

2. history命令和*.bash_history*的区别

Linux bashhistory通常存储在 每个会话结束时名为~/.bash_history*的文件中。*

默认情况下,会话期间发出的所有命令都将保存到此文件中以供进一步重复使用。在每个会话中,当我们退出 bash 时,所有内存中的命令都将写入*~/.bash_history文件。因此,我们当前执行的命令不会立即保存。因此,history命令和bash_history*文件的当前内容通常是不同的。

让我们检查*~/.bash_history*文件的最后五行:

$ tail -5 ~/.bash_history
tail
tail
cd
ls
ls

使用带有tail 的 -5 选项,我们可以在bash_history中拥有五个最近的命令。请注意,这些行属于上一个会话活动。我们还要检查历史记录的最后五行以 进行比较:

$ history 5 
1987 cd blogdemo 
1988 ls -l 
1989 cat pro.sh 
1990 ls -la 
1991 echo "${BASH_VERSION}"

这些行属于我们的会话活动,尚未写入bash_history

2. 从*.bash_history* 中删除最后n行

如果我们想删除之前会话的最后n行,或者如果我们最近结束了会话,我们应该从*~/.bash_history*中删除行。让我们从这个文件中删除最后五行:

$ for h in {1..5}; do sed -i '$d' ~/.bash_history; done;

sed 中的*-i选项允许就地编辑。$*与文件的最后几行匹配,d用于删除选定的行。

请注意,我们也可以使用任何文本编辑器打开*~/.bash_history*文件并手动删除这些行。

3. 删除历史中的最后n

如果我们注意history记录,我们可以看到每条记录都有一个行号。我们可以使用这个数字来删除一系列行:

$ for h in {1987..1991}; do history -d 1987; done

history -d选项将删除具有给定行号的行。在这种情况下,我们只需要在history -d中指定起始编号,因为删除第 1987 行后,第 1988 行将是第 1987 行,以此类推。

如果我们要删除证据,可以把之前的命令改一下,增加一条删除最后一行历史的命令,也就是我们最近的删除命令:

$ for h in {1987..1991}; do history -d 1987; done; history -d $(history 1 | awk '{print $1}')

我们用history 1获得历史的最后一行。然后我们用*$1*获得行号。

3.1. 创建函数

我们可以将前一行添加到*~/.bashrc中的新函数中以供进一步调用。 让我们编辑~/.bashrc*文件:

$ nano ~/.bashrc

让我们在~/.bashrc的末尾创建一个新函数:

historyDel() {
  for h in {$1..$2}; do
    history -d $1
  done
  history -d $(history 1 | awk '{print $1}')
}

请注意,对*~/.bashrc*进行任何更改 只会在新的终端会话中起作用。要将更改应用到当前终端,我们应该重新加载 .bashrc 内容

$ source ~/.bashrc

现在让我们在终端中调用我们的函数:

$ historyDel 2001 2004

请注意,historyDel函数将 2 个参数作为一个范围。如果我们想自动删除最后n行,我们可以创建另一个函数来获取n作为输入:

historyDeln() {
  n=$(history 1 | awk '{print $1}')    # current history number
  historyDel $(( $n-$1 )) $(( $n-1 ))  # Call historyDel with ranges
}

让我们用我们的新函数删除最后 5 行历史记录:

$ historyDeln 5

4. 自 Bash 5 以来的历史变化

由于 bash 5 的更改,现在有一个范围选项可用于删除history中的行。让我们从历史记录中删除 2001 到 2004 的行:

history -d 2001-2004

注意第一个数字是起点,第二个是删除终点。职位是包容性的。另外,我们可以使用向后删除。让我们删除最后 5 行历史记录

$ history -d -5--1

负索引从历史结束开始倒计时。因此,索引 -1 指的是当前history -d命令。