특정 날짜 범위 내의 모든 로그 파일을 분류하는 방법

특정 날짜 범위 내의 모든 로그 파일을 분류하는 방법

다음과 같은 이름의 로그 파일이 있습니다.

localhost_log_file.2017-09-01.txt
localhost_log_file.2017-09-02.txt
....

localhost_log_file.2017-10-30.txt

즉, 각 로그 파일의 형식은 다음과 같습니다.

localhost_log_file.YYYY-MM-DD.txt

2017-09-03과 2017-10-08 사이의 모든 로그 파일을 수집하고 싶습니다. 즉, from localhost_log_file.2017-09-03.txt부터 localhost_log_file.2017-10-08.txt.

현재 내가 하는 일은 다음 명령을 각각 개별적으로 실행하여 세 개의 중간 파일을 생성하는 것입니다.

for((i=3;i<=9;i++)) do cat localhost_log_file.2017-09-0$i.txt >> log1.csv ; done;

for((i=10;i<=30;i++)) do cat localhost_log_file.2017-09-$i.txt >> log2.csv ; done;

for((i=1;i<=8;i++)) do cat localhost_log_file.2017-10-0$i.txt >> log3.csv ; done;

그런 다음 중간 파일을 다음과 같이 결합했습니다.

cat log1.csv log2.csv log3.csv> totallog.csv

더 좋은 방법이 있나요?

답변1

중괄호 확장을 중첩할 수 있습니다.

짧고 달다:

cat localhost_log_file.2017-{09-{03..30},10-{01..08}}.txt > totallog.csv

일부 시스템(예: macOS)은 이전 버전의 Bash를 사용하며 중괄호 확장 정수 시퀀스에서 선행 0이 제거되었기 때문에 작동하지 않습니다. Linux의 경우 이것은 잘 작동합니다.

답변2

date이 유틸리티를 사용하여 관심 있는 날짜 범위를 반복하는 것은 어떻습니까? 귀하의 예는 다음과 같습니다.

# Set the date counter to the start date
d=2017-09-03

# Iterate until we reach the end date (i.e. the date after the last date we want)
while [ "$d" != 2017-10-09 ]; do

    # cat each file
    cat "localhost_log_file.${d}.txt";

    # Increment the date counter
    d="$(date -I -d "$d + 1 day")";

done

자세한 내용은 다음을 참조하세요.

또는 루프 본문 내에서 명령을 호출하는 cat대신 루프 결과를 명령에 전달할 수 있습니다 .cat

명령 대체를 사용하는 방법은 다음과 같습니다.

d=2017-09-03
cat $(while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done)

이는 파이프 합계를 사용하는 것과 동일한 효과입니다 xargs.

d=2017-09-03
while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done | xargs cat

답변3

사용 날짜:

for i in {0..35}; do
     cat localhost_log_file.$(date +%F -d "2017-09-03 + $i day").txt
done > totallog.csv

답변4

다음 명령을 사용하십시오.

ls | sort | while read i; do  if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]); then cat $i >> totallog.csv ; fi ; done

이렇게 실행해야 합니다

ls | sort | while read i Enter 키를 누르세요
do Enter 키를 누르세요
if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]) Enter 키를 누르세요 then Enter 키를 누르세요
cat $i >> totallog.csv Enter 키를 누르세요
fi Enter 키를 누르세요
done Enter 키를 누르세요

관련 정보