2013-06-06 5 views
1

에 0.1 0.2로 끝나는 결합 로그 파일은 내가 크기 제한이 있기 때문에 .1.2로 끝나는 로그 파일을 가지고있다.배쉬 - 원본 파일

예를 들어, 내 로그 디렉토리에이 같은 파일입니다 log20121212 log20121212.1 log20121212.2

내가 한 파일에 동일한 로그 날짜와 파일을 결합하기를 원하지만 반대 순서입니다. 예를 들어, 결합 된 파일에서 log20121212.2의 내용이 log20121212.1의 내용보다 먼저, log20121212.1의 내용이 log20121212의 내용보다 먼저 와야 와야한다.

그러나, 다른 날짜로 파일을 별도의 파일로 결합됩니다. 예를 들어 log20121212.1log20121212 파일과 결합해야하지만 log20121213.1log20121213 파일과 결합해야합니다.

이 방법이 있습니까?

+1

http://mattgemmell.com/2008/12/08/what- have-you-tried/ – Samveen

+0

로그 로테이트 설정을 바꾸는 것이 문제가되지 않습니까? – Wrikken

답변

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 
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 
을 또한 외관상으로 t (각 로그 파일에서 라인 순서 반전 안스 Wiechers의
+0

여기서 'ls'를 호출 할 필요는 없습니다. 'echo log20121212. * | ... '도 잘 작동해야합니다. – chepner

+0

@chepner 잘, 실제로'echo'는 한 줄에 결과를 반환하기 때문에 (다른 변경없이)'echo'와 함께 작동하지 않습니다. –

+1

참. 'printf "% s \ n"log20121212. * | ...'다음 :) – chepner

0

수정판 그는 아이디어는 먼저 최근 로그 정보를 정기적으로 인쇄하는 것입니다?)

ls -1 log* | sort -r | \ 
while read file ; do 
    tac "$file" >> "${file%.*}_out" 
done 
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 
0
shopt -s extglob 
tmp=$(mktemp) 
for f in log+([0-9]); do 
    cat "$f"{.2,.1,} > $tmp && mv $tmp "$f" 
done