bash - 将以.1 .2结尾的日志文件合并到原始文件中

时间:2013-06-06 19:39:13

标签: bash shell

我的日志文件以.1 .2结尾,因为它有大小限制。

例如,在我的日志目录中有以下文件: log20121212 log20121212.1 log20121212.2

我想将具有相同日志日期的文件合并到1个文件中,但顺序相反。例如,在合并文件中,log20121212.2的内容应位于log20121212.1的内容之前,log20121212.1的内容应位于log20121212的内容之前。

但是,具有不同日期的文件将合并到单独的文件中。例如,log20121212.1应合并到log20121212文件,但log20121213.1应合并到log20121213文件。

有办法做到这一点吗?

5 个答案:

答案 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