如何删除最后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命令。