我正试图从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}'
=仅打印行idsort -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] }
'
)
备注:由于您已经在使用bash
和awk
,因此不需要调用sort
或xargs