合并两个bash历史文件

时间:2016-04-01 12:27:40

标签: linux bash unix sed

假设我有两个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

但是我花了更多的时间来承认尝试找到一种方法来实现这一点,只使用未命名的管道,sed和/或任何其他常见的Linux工具没有变量和命令替换(`命令`)即可。我没有任何成功:(

任何Linux shell大师或sed大师都知道这是否可行?

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

4 个答案:

答案 0 :(得分:2)

如果我了解您要在历史文件中添加条目?您是否考虑使用内置的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看看。

答案 1 :(得分:1)

如果我理解正确,你只需要2个没有重复条目的文件(虽然不确定)。

所以你不需要sed或其他什么。只是:

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

如果您有重复项:

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

答案 2 :(得分:1)

你必须学习用于解决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

答案 3 :(得分:0)

如果您像这样创建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文件中的一个文档中拥有所有命令。 如果你然后使用sort和uniqe喜欢

sort temp.txt |uniq

您可以在1个文件中获得2个历史文件中使用的所有uniq命令。