8GB 로그 파일(Rails 프로덕션 로그)이 있습니다. 일부 날짜(행) 사이에 잘라야 합니다. 이 작업을 수행하려면 어떤 명령을 사용할 수 있나요?
답변1
그것은 마치
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"
답변2
FOO와 BAR(FOO와 BAR 포함) 사이의 모든 내용을 인쇄하려면 다음을 시도해 보세요.
$ sed -n '/FOO/,/BAR/p' file.txt
답변3
이렇게 하면 원하는 작업이 수행됩니다.
포함 및 제외 매개변수 날짜를 표시합니다.
# 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
이것은테스트 데이터 생성기.
답변4
이렇게 큰 파일을 작업하는 것은 항상 어렵습니다.
한 가지 방법은 이 파일을 여러 개의 작은 파일로 분할하는 것입니다. 이를 위해 분할 명령을 사용할 수 있습니다.
split -d -l 50000 ToBigFile.data file_
분할된 경우에도 bash for 루프에서와 마찬가지로 파일을 계속 사용할 수 있습니다.
for f in `ls file_*`; do cat $f; done;
그러나 cat 대신 reverse grep을 사용하여 원치 않는 데이터를 제거할 수 있는데, 이는 이와 관련이 없습니다. (또는 필요한 개선 유형).
이 시점에서는 많은 작은 파일만 처리하게 되며 위에서 언급한 다른 명령은 많은 작은 파일에서 작동합니다.
완료되면 두 번째 for 루프를 사용하여 더 작은 새 파일을 다시 빌드할 수 있습니다.
for f in `ls file_*`; do cat $f >> NewFile.data ; done;
고쳐 쓰다 데이터를 여러 파일로 분할하기 시작하면 하드 드라이브가 많은 작업을 수행하므로 시간이 걸립니다. (이 문제에 대해서는 5분 정도 소요된 것으로 보입니다).
반면에 다음 단계는 더 빠를 수도 있습니다.
따라서 이 접근 방식은 간단한 grep, awk, sed 작업에는 의미가 없을 수 있지만 검색 패턴이 더 복잡해지면 속도가 더 빨라질 수 있습니다.