AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 486022
Accepted
Stephen Rasku
Stephen Rasku
Asked: 2018-12-05 15:11:57 +0800 CST2018-12-05 15:11:57 +0800 CST 2018-12-05 15:11:57 +0800 CST

合并多个带有时间戳的 .bash_history 文件

  • 772

我.bash_history通过在 VM 上的快照之间切换生成了多个文件。我想将所有这些文件恢复到.bash_history我当前运行的实例中的单个实时文件中。

这些文件中有时间戳,我想尽可能地保留它们。但是,看起来有些行上没有时间戳。例如:

#1542817796
vi ~/.bash_profile 
set +x
cd -
cd w/Edge-Agent/edge-agent-ged/
make 
set -x
man make
make -npq
make -npq .DEFAULT
make 
make 
ack npq /etc
ack npq /usr/share/
set +x
ack npq /usr/share/
sudo vi /usr/share/bash-completion/completions/make
dv
hg diff 
vi ~/.bashrc
#1542826064
ls
#1542826066
vi ~/.bashrc
#1542826074
cd ..
#1542826321

我想按时间戳对合并列表进行排序,因为我在快照之间来回切换,并且文件相互交错。如果命令没有可用的时间戳,我们可以从之前的最后一个时间戳和之后的第一个时间戳推断它。

bash command-history
  • 4 4 个回答
  • 682 Views

4 个回答

  • Voted
  1. Best Answer
    JigglyNaga
    2018-12-06T06:32:18+08:002018-12-06T06:32:18+08:00

    使用 GNU m4(它支持最多 LONG_MAX 的编号转移)和一些额外sed的准备输入:

    #!/bin/sh
    
    { cat <<"EOF"
    m4_define(m4_chunk,`m4_divert(-1)m4_undivert($1)m4_divert($1)#$1')m4_dnl
    m4_define(m4_,``m4_'')m4_dnl
    m4_define(`m4_LQ',`m4_changequote([,])`m4_dnl'
    m4_changequote`'')m4_dnl
    m4_define(`m4_RQ',`m4_changequote([,])m4_dnl`
    'm4_changequote`'')m4_dnl
    EOF
    sed -e "s/m4_/m4_()/g;s/\`/m4_LQ()/g;s/'/m4_RQ()/g;s/m4_/\`'m4_/g" -e 's/^#\([0-9]\+\)$/m4_chunk(\1)/'
    } | m4 -P
    

    用法:

    cat edgeos_history.* | sort_history.sh > merged_history
    

    该m4_chunk函数完成了大部分工作,因为当所有输入结束时,单独的块按数字升序“未转移”。脚本的其余部分是保护m4_输入中的任何引号和现有序列不被m4.

    LQ以及RQ基于 Michael Breen 的M4 宏语言注释中的定义。

    • 1
  2. Michael Prokopec
    2018-12-05T15:28:18+08:002018-12-05T15:28:18+08:00

    为什么不做类似的事情,cat /path/to/one/.bash_history >> /path/to/live/.bash_history然后您可以删除重复的条目,awk '!seen[$0]++' .bash_history >> .bash_history2然后删除原始条目并将 .bash_history2 重命名为 .bash_history。但是,像这样删除重复项会留下空的时间戳。

    • 0
  3. RudiC
    2018-12-06T06:17:11+08:002018-12-06T06:17:11+08:00

    这有帮助吗:

    awk '/^#[0-9]*$/ {TS = $0; next} {print TS, $0}' file* | sort
    #1542817796 ack npq /etc
    #1542817796 ack npq /usr/share/
    #1542817796 ack npq /usr/share/
    #1542817796 cd -
    #1542817796 cd w/Edge-Agent/edge-agent-ged/
    #1542817796 dv
    #1542817796 hg diff 
    #1542817796 make 
    #1542817796 make 
    #1542817796 make 
    #1542817796 make -npq
    .
    .
    .
    

    确保将所有历史文件列为awk.

    编辑:一些不令人满意的,不可移植的文章,以保留命令的原始顺序:

    awk '/^#[0-9]*$/ {TS = $0; next} {print TS, NR, $0}' file* | sort  -k1,1 -k2,2n
    

    .

    awk '/^#[0-9]*$/ {TS = $0; next} {print TS,  $0}' file* | sort  -mk1,1 
    
    • 0
  4. anthony
    2020-10-09T15:16:54+08:002020-10-09T15:16:54+08:00

    很长一段时间以来,我一直在寻找一种合并 bash 历史(带有时间戳)的方法,但似乎没有什么可以接受的。

    那就是......将磁盘上的“.bash_history”与内存中的shell“历史”合并。在这些时间戳中保留时间戳顺序和命令顺序。

    根据定义的 perl RE,可选择删除唯一命令(即使是多行命令)和/或删除(清除)简单和/或敏感命令。调整以适应!

    这是结果: https ://antofthy.gitlab.io/software/history_merge.bash.txt

    脚本中的第一个“perl”命令只是连接输入历史文件。默认将"$HISTFILE" <(history -w /dev/stdout)磁盘历史与内存历史合并,将它们分成时间戳记录。然后第二个“perl”进行合并。

    它将结果保存在一个临时文件中,该文件可以随意替换磁盘上的历史记录或内存中的历史记录(当前两者都可以)。

    调整以适应。

    享受

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve