合并两个bash历史文件

假设我有两个bash历史文件,如下所示:

history1.txt

1 ls 2 cd foo ... 921 history > history1.txt 

history2.txt

  154 vim /etc/nginx/nginx.conf 155 service nginx restart ... 1153 history > history2.txt 

我知道我可以很容易地写一个bash脚本来合并这两个文件在一起,以便生成的文件包含行1到1153没有重复的历史条目…像下面的bash脚本:

merge.sh

 HEAD=`head -n 1 history2.txt | sed -e 's/^[[:space:]]*//'` sed -n -e "1,/$HEAD/p" history1.txt > merged.txt sed -e "1,$ s/$HEAD//" -e '/^\s*$/d' history2.txt >> merged.txt 

但我花了更多的时间比我想承认试图find一种方法来完成这个只使用未命名的pipe道,sed和/或任何其他常见的Linux utils 没有variables和命令replace(`命令`) 。 我没有任何成功:(

任何Linuxshell大师或sed大师知道这是可能的?

注意:我知道merge.sh脚本将不适用于所有边缘情况。

如果我明白这是正确的,你只是有2个文件没有重复的条目(虽然不知道)。

所以你不需要sed或这里的东西。 只是:

 cat history1.txt history2.txt | sort -n > output 

如果你有重复的话:

 cat history1.txt history2.txt | sort -n -u > output 

你必须学习正确的工具来解决UNIX中的问题,因为有很多错误的方法,像他们解决一个给定的问题,但实际上是缓慢的,危险的,不可移植的,脆弱的等等。

sed是为了简单替换个别行,就是这样。 shell用于处理文件和进程,并将调用排序到UNIX工具,就是这样。 对于通用的文本处理,标准的UNIX工具是awk。

以下是未经测试的,因为您没有提供可以运行测试工具的示例输入/输出,但是如果不完全正确,它将会关闭:

 awk ' NR==FNR {file1[$1]=$0;next} { for (i=(prev+1); i<$1; i++) { print file1[i] } print prev = $1 } ' history1.txt history2.txt 

如果我明白你想添加条目到你的历史文件? 你有没有考虑使用内置的history -r

 $ cat foo echo "history" $ history | tail -n 5 1371 rm foo 1372 tail .bash_history > foo 1373 vim foo 1374 cat foo 1375 history | tail $ history -r foo $ history | tail -n 5 1374 cat foo 1375 history | tail 1376 history -r foo 1377 echo "history" 1378 history | tail 

如果有什么东西可以满足您的需求,可以给$ help history一下。

如果你创建这样的flie

  1 ls 2 cd foo 921 history > history1.txt 154 vim /etc/nginx/nginx.conf 155 service nginx restart 1153 history >> history1.txt 

现在一切,都是历史,在1个文件。

使用cut命令来选择只有命令行才能结束剪掉的行号。 (-d用于切割空格,-f用于从4号柱选择直到结束)

 cut -d " " -f 4- histroy1.txt > temp.txt 

现在在temp.txt文件中有一个文档中的所有命令。 如果你然后使用排序和uniqe喜欢

 sort temp.txt |uniq 

您将得到1个文件中2个历史文件中使用的所有uniq命令。