【发布时间】:2017-08-02 02:04:40
【问题描述】:
我编写了一个脚本来整理我的 .bash_history 文件,从持久化的历史记录中过滤“无趣”的命令,例如 ls。
(我知道有 HISTIGNORE 变量,但这也会将此类命令从当前会话的内存历史记录中排除。我发现将它们放在单个会话的范围内很有用,但不会在会话之间持续存在.)
历史文件可以包含带有嵌入换行符的多行历史条目,因此这些条目由时间戳分隔。该脚本采用如下输入文件:
#1501304269
git stash
#1501304270
ls
#1501304318
ls | while IFS= read line; do
echo 'line is: ' $line
done
并过滤掉单行ls、man和cat命令,产生:
#1501304269
git stash
#1501304318
ls | while IFS= read line; do
echo 'line is: ' $line
done
请注意,多行条目是未经过滤的——我认为如果它们足够有趣以保证多行,那么它们值得记住。
我在 Awk 中实现了它,但我一直在阅读 Sed 的多行功能(N、h、H、x 等),我想为此尝试一下.如果不出意外,我很想比较两者的速度。
这是 awk 脚本:
/^#[[:digit:]]{10}$/ {
timestamp = $0
histentry = ""
next
}
$1 ~ /^(ls?|man|cat)$/ {
if (! timestamp) {
print
} else {
histentry = $0
}
next
}
timestamp {
print timestamp
timestamp = ""
}
histentry {
print histentry
histentry = ""
}
{ print }
这可以使用 Sed 完成吗?
【问题讨论】:
-
你知道
HISTIGNORE吗? superuser.com/questions/232885/… - 你可以在你的 .bashrc 中使用export HISTIGNORE=ls:man:cat,它会做类似的事情而无需编写任何代码。 -
@JohnZwinck 是的,但是这些命令也会从我当前会话的历史记录中被忽略。我经常点击
up或ctrl-p来回忆最近的ls并对其进行调整,所以我不想在这种情况下使用HISTIGNORE。 -
如果你是一个受虐狂,你也许可以在
sed中实现。鉴于您在awk中有一个完美的版本,我会算上我的幸运星并转向其他追求;-)。除非您使用的是 Pentium 3 硬件,否则速度不会有任何显着差异;-)。恕我直言。祝大家好运!。 -
谢谢@shellter 我知道你可能是对的:D