1

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

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

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

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

有没有办法做到这一点?

4

5 回答 5

0
shopt -s extglob
tmp=$(mktemp)
for f in log+([0-9]); do
    cat "$f"{.2,.1,} > $tmp && mv $tmp "$f"
done
于 2013-06-07T00:22:34.470 回答
0

Ansgar Wiechers 的修改版本,它还颠倒了每个日志文件中的行顺序(显然这个想法是首先打印最近的日志信息?)

ls -1 log* | sort -r | \
while read file ; do
    tac "$file" >> "${file%.*}_out"
done
于 2013-06-06T19:59:30.120 回答
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
于 2013-06-06T19:49:20.363 回答
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
于 2013-06-06T19:50:18.927 回答
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
于 2013-06-06T20:12:43.197 回答