HISTTIMEFORMAT 并删除匹配的历史记录条目

HISTTIMEFORMAT 并删除匹配的历史记录条目

我想删除与某个字符串匹配的所有历史条目。我发现 这个方法:

grep -v searchstring "$HISTFILE" > /tmp/history
mv /tmp/history "$HISTFILE"

但它不考虑 HISTTIMEFORMAT 注释,例如:

#1517681911
echo 1
#1517681918
echo 2
#1517681931
echo 3

如果我想删除“echo 2”,则前面的注释也需要删除。我怎样才能做到这一点?

答案1

sed 是你的朋友(awk 也可以做到),你可以使用这个代码(假设匹配的每一行确实有一个时间线):

sed '$!N;/echo 2/!P;D' "$HISTFILE" > /tmp/history

或者直接在历史文件中执行此操作:

sed -i '$!N;/echo 2/!P;D' "$HISTFILE"

你的例子将变成这样:

#1517681911
echo 1
#1517681931
echo 3

一种更具限制性的匹配:仅删除模式之前的实际时间线(匹配具有一个字段为 # 后跟十位数字的行)

awk -vp="echo 2" ' {b=$0};b~p{next}
                   NF=1 && b~/#[0-9]{10}/{a=b;next}
                   {print(a RS b)}
                 ' "$HISTFILE"

相关内容