按时间戳排序`.bash_history`

时间:2017-12-07 13:41:17

标签: bash sorting

我已使用.bash_history中的HISTTIMEFORMAT="%d.%m.%y %T "指示信息为我的.bashrc启用了时间戳。但是,有时候.bash_history中的条目顺序搞砸了,我想按时间戳对该文件进行排序。不幸的是,时间戳与条目不在同一行,而是在上面一行,如下所示:

#1512649029
a command
#1512649032
another command
#1512649039
a third command

那么如何通过这些"对"对文件进行排序?线?此外,有些条目没有时间戳,例如上面没有#...行的行。我希望这些行聚集在文件的顶部。谢谢!

3 个答案:

答案 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

享受。