我已使用.bash_history
中的HISTTIMEFORMAT="%d.%m.%y %T "
指示信息为我的.bashrc
启用了时间戳。但是,有时候.bash_history
中的条目顺序搞砸了,我想按时间戳对该文件进行排序。不幸的是,时间戳与条目不在同一行,而是在上面一行,如下所示:
#1512649029
a command
#1512649032
another command
#1512649039
a third command
那么如何通过这些"对"对文件进行排序?线?此外,有些条目没有时间戳,例如上面没有#...
行的行。我希望这些行聚集在文件的顶部。谢谢!
答案 0 :(得分:2)
我们可以使用简单的sed
程序加入行:
/^$/d # skip blank lines
/^#/N # append next line to timestamp
/^#/!s/^/#0\n/ # command without timestamp - prefix with #0
s/#// # remove initial #
y/\n/ / # convert newline to space
另一个恢复时间戳注释:
s/(\S+) /#\1\n/
将它们放在一起,我们得到
sort_history() {
sed -e '/^$/d' -e '/^#/N' -e '/^#/!s/^/#0\n/' \
-e 's/#//' -e 'y/\n/ /' <<<"$in" \
| sort -n | sed -e 's/\(\S\+\) /#\1\n/'
}
答案 1 :(得分:1)
免责声明:这可能不是最优雅,最简单的解决方案。 但是,以下bash shell脚本片段对我有用:
#!/bin/bash
function BashHistoryJoinTimestampLines() {
COMMAND_WITHOUT_TIMESTAMP=TRUE
while read line; do
if [ "${line:0:1}" = "#" ] # This should be a timestamp line
then echo -ne "$line\t" # the -n option supresses the line feed
COMMAND_WITHOUT_TIMESTAMP=FALSE
else if [ ${COMMAND_WITHOUT_TIMESTAMP} = TRUE ]
then echo -ne "#0\t"
fi
echo $line
COMMAND_WITHOUT_TIMESTAMP=TRUE
fi
done
}
#
# Example:
BashHistoryJoinTimestampLines < $HISTFILE | sort
在Unix / Linux中,默认情况下通过对sort
实用程序进行流水线处理来处理文本,这些记录由行尾分隔。
为了对此应用程序使用“ sort
”,必须首先将时间戳记行与包含命令的历史记录行连接在一起。在该脚本中,没有在时间戳前面的行将获得#0
(1970年1月1日)的伪时间戳。在此脚本中,我已将TAB字符用作时间戳和命令之间的分隔符。
答案 2 :(得分:0)
很长时间以来,我一直在寻找一种合并bash历史记录(带有时间戳)的方法,似乎没有什么可以接受的。
那是...将磁盘“ .bash_history”与内存外壳“ history”合并。保留时间戳顺序以及这些时间戳内的命令顺序。
根据已定义的perl RE,可以选择删除唯一命令(即使是多行命令)和/或删除(清除)简单和/或敏感命令。调整以适合!
这是结果... https://antofthy.gitlab.io/software/history_merge.bash.txt
享受。