8Gb 로그 파일 (레일 프로덕션 로그)이 있습니다. 날짜 (줄) 사이를 잘라야합니다. 이를 위해 어떤 명령을 사용할 수 있습니까?
sed
쉽게 할 수 있습니다.
8Gb 로그 파일 (레일 프로덕션 로그)이 있습니다. 날짜 (줄) 사이를 잘라야합니다. 이를 위해 어떤 명령을 사용할 수 있습니까?
sed
쉽게 할 수 있습니다.
답변:
같은 것
sed '1,/last date prior to chunk/d;/first date after chunk/,$d' logfile | tee cut-log | less
tee cut-log
파일에 무엇을 넣었는지 화면에서 볼 수 있습니다 cut-log
.
편집하다:
fred.bear의 정확한 표준을 충족시키기 위해 sed 솔루션이 있습니다 (물론 awk 솔루션은 훨씬 더 아름답습니다).
b=BB; e=EE ;echo -e "AA\nAA\nBB\nBB\nCC\nCC\nDD\nDD\nEE\nEE\nFF\nFF" | sed -n ":b;/$b/b p;n;b b;:p;p;n;/$e/b e;b p;:e;p;n;/$e/b e;q"
sed
일치시킬 수 있습니다 awk
속도, 그리고 실제로 조금 더 빨랐다.
이 ... 당신이 원하는 것을 할 것입니다
포함 및 제외 모두 매개 변수 날짜가 표시됩니다.
# set Test args
set 2011-02-24 2011-02-26 "junk"
from="$1"
till="$2"
file="$3"
# EITHER ==== +++++++++
# Ouptut lines between two parameter dates INCLUDING the parameter dates
awk -v from=$from -v till=$till '
($2 >= from) && ($2 <= till) { print $0 ; next }
($2 > till) { exit }' "$file"
# OR ======== ---------
# Ouptut lines between two parameter dates EXCLUDING the parameter dates
awk -v from=$from -v till=$till '
($2 > from) && ($2 < till) { print $0 ; next }
($2 >= till) { exit }' "$file"
필드 2에서 (정렬 된) 날짜를 테스트합니다. 다음은 테스트 데이터의 예입니다.
98 2011-02-05 xxxx
99 2011-02-05 xxxx
100 2011-02-06 xxxx
101 2011-02-06 xxxx
그리고 여기에 테스트 데이터 생성기가 있습니다.
awk -v from="$from" -v till="$till" '($2 >= from) { if ($2 <= till) { print } else { exit }' "$file"
if
명령문 의 지속 시간입니다 (한 줄당 1 개도 아님). 논리 흐름은 사실상 동일하며 실행 시간의 차이는 나노초 단위로 계산됩니다 .... "else"를 사용하지 않은 유일한 이유는 이것이 실제로 첫 번째 스크립트 (4 일 동안 제외)라는 점입니다. 전에 몇 가지 예를 들었을 때) ... 그리고 그것은 내가 찾은 첫 번째 가능한 분기 메커니즘입니다 ... (그리고 언급 한 것처럼 빠릅니다). 나는 일반적으로 Tryawk
sed
q
로그 파일에 날짜가이 형식 YYYY-MM-DD
인 경우 2011-02-10과 같은 모든 항목을 찾으려면 다음을 수행 할 수 있습니다.
grep 2011-02-10 log_file
이제 2011-02-10 및 2011-02-11에 대한 항목을 찾으려면 다시 grep
여러 패턴을 사용하십시오 .
grep -E '2011-02-10|2011-02-11' log_file
grep
날짜 범위 가 파일의 시작 부분에 있더라도 전체 파일을 검색 합니다. 평균적으로 "범위 내 종료 후 항목"과 비교할 때 검색 시간이 두 배로 늘어납니다. grep 시간 결과는 여기의 sed 예제와 거의 동일합니다 (1 분 58 초). 내 시간 테스트 결과에 대한 링크는 다음과 같습니다. paste.ubuntu.com/573477
이 크기의 파일로 작업하는 것은 항상 어렵습니다.
앞으로이 파일을 몇 개의 작은 파일로 분할하여 split 명령을 사용할 수 있습니다.
split -d -l 50000 ToBigFile.data file_
분할 된 경우에도 bash for 루프를 사용하는 것처럼 파일로 작업 할 수 있습니다
for f in `ls file_*`; do cat $f; done;
그러나 고양이 대신 반전 된 grep을 사용하여 원치 않는 데이터를 제거 할 수 있습니다. (또는 필요한 종류의 개선).
이 시점에서 많은 작은 파일로 작업 할 것이고 위에서 언급 한 다른 명령은 많은 작은 파일에서 작동 할 것입니다.
그리고 완료되면 두 번째 for 루프를 사용하여 더 작은 새 파일을 다시 빌드 할 수 있습니다.
for f in `ls file_*`; do cat $f >> NewFile.data ; done;
업데이트 데이터를 여러 파일로 분할하기 시작하면 하드 드라이브에 많은 작업이 수행 될 것이며 시간이 오래 걸립니다. (이 질문에서 분명히 5 분).
반면에 다음 단계는 아마도 더 빠를 것입니다.
따라서이 방법은 단순한 grep, awk, sed 작업에는 의미가 없지만 검색 패턴이 복잡해지면 더 빨라질 수 있습니다.
perl -wlne '/^2011-02-24/ .. /^2011-02-25/ and print' log_file