다음과 같은 이름의 로그 파일이 있습니다.
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 키를 누르세요