Programming/Bash Shell Script

[Bash Shell Script] 로그 추출, 정리 쉘 스크립트 예제

Nirsa 2019. 12. 17. 01:36
반응형

로그 추출 및 정리 스크립트 입니다.

 

압축 되어있는 로그 파일을 꺼낸 후 필요한 기간, 날짜 또는 시간별로 로그를 뽑아낼 수 있는 스크립트로, 많은 서버들의 로그 파일을 특정 기간, 특정 날짜, 특정 시간대별로 추출할 필요가 있을 때 사용하시면 됩니다.

 

1. 스크립트 실행 환경

- OS : CentOS6.7

- Shell : Bash

- 매일 logs_backup_년도-월-일.tar.gz 의 로그 압축 파일 생성

- 로그파일 내의 날짜 키워도는 날짜,월(영문표기),년도 (ex.31/Dec/2019)

- 각 파일안에 들어있는 로그의 날짜가 일정치 않음 (3~7일 분량의 로그가 쌓일 경우)

 

아래 스크립트 안에서도 수정할 부분이 많이 있기 때문에 무작정 사용하시지 마시고 환경에 따라 수정 및 충분한 테스트 후에 사용하시기 바랍니다.

 

스크립트 실행 방법은 아래와 같습니다.

 

스크립트명.sh 년도 월 시작일(01) 해당월의일수

ex)  log_extraction.sh 2019 12 01 31

log_extraction.sh 2019 11 01 30

#!/bin/bash 

acc=/home/log 

start=1 
end=`expr $3 + 1` 
njoy=`expr $2 + 1` 


echo "---------------------------------------" 
qq=`expr $2 + 1` 
bb=`expr $2 - 1` 
for aa in `seq -f "%02g" $bb $bb`; do for ww in a `seq -f "%02g" $qq $qq`; do echo "로그 추출을 시작합니다."; done done; 
echo "---------------------------------------" 
echo "$1년 $2월 로그 추출을 시작합니다." 

for i in `seq -f "%02g" $start $end` 
do 
if [ "$i" -ne "$end"  ]; then 
back="/backup/logs_backup_$1-$2-$i.tar.gz"    # 백업된 압축 파일명, 경로 맞춰 (수정 필요)
name="/home/logs_backup_$1-$2-$i.tar.gz"     # 백업파일을 가져온 후 실제로 스크립트가 작동하게 될 경로 (수정 필요)
cp $back $acc/logs/ 
tar -zxvf $name ./access_log > /dev/null 2>&1  # 압축파일 안의 로그 파일명 확인, 필자의 경우 access_log (수정 필요)
a=`expr $i - 1` 
cat $acc/access_log | grep $a/$4/$1 > $acc/logs/access_log.$1-$2-$i; rm -f $acc/access_log; rm -f $acc/logs/logs_backup_$1-$2-$i.tar.gz     # 로그파일명, 로그 파일안의 날짜 표기 방법 (필자의 경우 11/Dev/2019 처럼 됨) 수정필요하며, 추출 후 $name으로 가져온 압축파일 등 삭제하는 라인으로 수정 시 주의 필요함
fi 


## 로딩 바 구현 (https://nirsa.tistory.com/19 참고)
if [ "$i" == "01"  ]; then 
echo -ne '#                                 (01%)\r' 
fi 

if [ "$i" == "10"  ]; then 
echo -ne '##########                        (33%)\r' 
fi 

if [ "$i" == "20"  ]; then 
echo -ne '####################              (66%)\r' 
fi 

if [ "$i" == "27"  ]; then 
echo -ne '###############################   (97%)\r' 
fi 

if [ "$i" == "$end"  ]; then 
echo -ne '################################  (100%)\r' 
sleep 1 
fi



## 이 아래부터는 위에서 주석처리 후 설명한 내용과 큰 차이 없음

if [ "$i" == "$end" -a "$2" -lt "12" ]; then 
q=01 
back="/backup/logs_backup_$1-$ww-$q.tar.gz" 
name="/home/logs_backup_$1-$ww-$q.tar.gz" 
cp $back $acc/logs/ 
tar -zxvf $name ./access_log > /dev/null 2>&1 
cat $acc/access_log | grep $3/$4/$1 > $acc/logs/access_log.$1-$ww-$q; rm -f $acc/access_log; rm -f $acc/logs/logs_backup_$1-$ww-$q.tar.gz; rm -f $acc/logs/access_log.$1-$2-$q 
fi 


if [ "$i" == "$end" -a "$2" == "12" ]; then 
q=01 
r=`expr $1 + 1` 
back="/backup/logs_backup_$r-01-$q.tar.gz" 
name="/home/logs_backup_$r-01-$q.tar.gz" 
cp $back $acc/logs/ 
tar -zxvf $name ./access_log > /dev/null 2>&1 
cat $acc/access_log | grep $3/Dec/$1 > $acc/logs/access_log.$r-01-$q; rm -f $acc/access_log; rm -f $acc/logs/logs_backup_$r-01-$q.tar.gz; rm -f $acc/logs/access_log.$r-01-$q 
fi 

done 

for i in `seq -f "%02g" $start $end` 
do 
if [ "$2" -ge "02"  ]; then 
# z=`expr $2 - 1` 
rm -f $acc/logs/access_log.$1-$aa-$i > /dev/null 2>&1 
fi 

if [ "$2" == "01"  ]; then 
# z=`expr $2 - 1` 
rm -f $acc/logs/access_log.$1-12-$i > /dev/null 2>&1 
fi 
done 

echo -e "\033[32m"로그 추출을 완료 하였습니다 :D "\033[0m"

 

필요하실 경우 댓글 등을 남겨주시면 스크립트 검토 해드릴 수는 있지만 추출하려는 목적, 압축 파일명, 로그 파일명 등 필요한 정보가 많다는 점 참고 해주세요.

반응형