我有一个包含 bash 历史记录的文件,并且想要在新机器上“导入”命令。该文件包含history
格式如下的输出HISTTIMEFORMAT="%F%t%T%t"
:
$ history > history.txt
所以结果是:
1 2018-01-01 17:56:36 foo
2 2018-01-01 18:01:21 bar
3 2018-01-01 18:02:02 buz
当我~/.bash_history
用该文件的内容替换 时,计数器和日期和时间成为命令的一部分。所以输出看起来history
就像
1 2018-06-13 18:10:15 1 2018-01-01 17:56:36 foo
2 2018-06-13 18:10:15 2 2018-01-01 18:01:21 bar
3 2018-06-13 18:10:15 3 2018-01-01 18:02:02 buz
我在导入之前清理了命令列表。只需在文本编辑器中打开它,并将“ ^[\s]+[0-9]+[\s]+[0-9]{4}-[0-9]{2}-[0-9]{2}[\s]+[0-9]{2}:[0-9]{2}:[0-9]{2}[\s]+
”替换为空字符串。看起来好多了。但随后我丢失了有关命令的日期和时间的信息:
1 2018-06-13 18:10:15 foo
2 2018-06-13 18:10:15 bar
3 2018-06-13 18:10:15 buz
如何导入历史记录并保留日期和时间元信息?
答案1
的输出history
供您阅读。实际上,如果你查看你的~/.bash_history
文件,你会发现类似的内容
#1528908193
history
#1528908354
vim .bash_history
#1528908359
history
#1528908591
man history
#1528908594
这就是时间戳的存储方式。
和 DopeGhoti 一样,为什么不是 scp ?
答案2
@Charles 非常感谢有价值的提示!它引导我找到解决方案。
为了操作 bash 历史记录条目的日期和时间,我只需将其替换~/.bash_history
为格式正确的原始文件。条目的正确格式是
#TIMESTAMP
command
所以就我而言,我需要执行以下步骤:
(步骤 0:将历史记录导出到文本文件中:history > history.txt
。)
步骤 1:在文本编辑器中打开文件并清理文件。结果应该是,每一行都包含date
+ space
time
+ tab
+ command
。由于在我的例子中,条目的格式为%F%t%T%t
,所以我需要这个基于正则表达式的替换:
FROM: ^([\s]+[0-9]+[\s]+)([0-9]{4}-[0-9]{2}-[0-9]{2})[\s]+([0-9]{2}:[0-9]{2}:[0-9]{2}[\s]+)
TO: $2 $3
步骤 2:将结果复制到 Calc(或 Excel)。现在我们有两列。
步骤 3:将日期和时间列中的值转换为时间戳:
=(A1 - DATEVALUE("1/1/1970"))*86400
步骤 4:将带有时间戳和命令的列复制回文本编辑器。
步骤5:将结果转换为目标格式:
FROM: ^([0-9]{10})\t
TO: #$1\n
第 6 步:将 替换~/.bash_history
为结果文本文件:
$ cp history.txt > ~/.bash_history