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