假设我有两个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脚本不适用于所有边缘情况。
答案 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命令。