我的日志文件以.1
.2
结尾,因为它有大小限制。
例如,在我的日志目录中有以下文件:
log20121212
log20121212.1
log20121212.2
我想将具有相同日志日期的文件合并到1个文件中,但顺序相反。例如,在合并文件中,log20121212.2
的内容应位于log20121212.1
的内容之前,log20121212.1
的内容应位于log20121212
的内容之前。
但是,具有不同日期的文件将合并到单独的文件中。例如,log20121212.1
应合并到log20121212
文件,但log20121213.1
应合并到log20121213
文件。
有办法做到这一点吗?
答案 0 :(得分:0)
这样的事情应该有效:
#!/bin/bash
for f in $(ls -1 log* | sort -r); do
cat "$f" >> "${f%.*}.tmp"
done
for f in log*.tmp; do
mv -f "$f" "${f%.tmp}"
done
答案 1 :(得分:0)
如果要提供日志文件的名称:
$ ls -1 log20121212.* | sort -t1 -k2 -r
log20121212.4
log20121212.3
log20121212.2
log20121212.1
如果要对所有日志文件进行排序:
$ ls -1 log* | sort -n | sort -t1 -k2 -r
log20121213.2
log20121213.1
log20121212.4
log20121212.3
log20121212.2
log20121212.1
log20121211.2
log20121211.1
答案 2 :(得分:0)
Ansgar Wiechers的修改版本,它也颠倒了每个日志文件中行的顺序(显然这个想法是先打印最近的日志信息?)
ls -1 log* | sort -r | \
while read file ; do
tac "$file" >> "${file%.*}_out"
done
答案 3 :(得分:0)
未经测试的纯粹bash解决方案
for f in log*; do
base="${f%%.*}" # base name for this log, without the .1 part
>> "${base}-final" # make sure the file exists
cat "$f" "${base}-final" > tmp # use mktemp to create this file if you want to be secure
mv tmp "${base}-final"
done
答案 4 :(得分:0)
shopt -s extglob
tmp=$(mktemp)
for f in log+([0-9]); do
cat "$f"{.2,.1,} > $tmp && mv $tmp "$f"
done