如何从bash历史记录中删除带有导出的条目



我正试图从bashhistory中删除包含export的条目。我想我离解决方案不远了。到目前为止,我有:

history | grep export | awk '{print $1}' | sort -r | xargs -I {} bash -c "echo 'Deleting [{}]' && history -d {}"

  • history=获取历史行id+行内容
  • CCD_ 5=在包含";"出口">
  • awk '{print $1}'=仅打印行id
  • sort -r=按降序对行ID进行排序(否则,删除以前的ID时,所有后续ID都会移位(
  • xargs -I {} bash -c "echo 'Deleting [{}]' && history -d {}"=对于每个行id,运行历史删除fn

当我对命令的每个部分进行故障排除时,我似乎都得到了我需要的东西,但总的来说,它仍然失败,因为我试图删除的行超出了范围

有人能帮我完成这个命令吗

也许更简单的方法是直接从history文件中筛选和删除。

$ sed -i.bak '/<export>/d' "$HISTFILE"

我已经将过滤后的单词包装在单词边界中,但可以根据您的过滤要求进行调整。

还会创建一个备份,以备需要回滚时使用。

$ cat "$HISTFILE" 

然后将向您显示新的历史文件。如果对删除的条目感到满意,请重新加载历史记录以使更改全局生效。

$ history -r

这可能是您想要的(您应该从命令行运行这些命令,因为HISTFILE很可能是为非交互式shell设置的(:

mapfile -t offsets < <(history | awk '/export/{print $1 - n++}')
for offset in "${offsets[@]}"; do history -d "$offset"; done
history -w

在运行之前备份原始历史文件(通常为~/.bash_history(。

您的历史记录中似乎有包含export的多行字符串。我假设您也想删除相关的命令。

以下解决方案不是防弹的,但它应该适用于大多数情况:

#!/bin/bash
# makes sure that the output of 'history' isn't messed up
HISTTIMEFORMAT=''
# needed for editing the history from a script
HISTFILE=~/.bash_history
set -o history
# parse and modify the history
while IFS='' read -r id
do
echo "deleting $id from history"
history -d "$id"
done < <(
history |
awk '
/^ *[1-9][0-9]* +/ { id = $1 }
/export/ && !seen[id]++ { list[++n] = id }
END { for (i = n; i >= 1; i--) print list[i] }
'
)

备注:由于您已经在使用bashawk,因此不需要调用sortxargs

最新更新