로그 파일에서 부분을 잘라내는 방법?


18

8Gb 로그 파일 (레일 프로덕션 로그)이 있습니다. 날짜 (줄) 사이를 잘라야합니다. 이를 위해 어떤 명령을 사용할 수 있습니까?


1
얘들 아,이 질문은 파일 에 관한 것이므로 "안티 업!"입니다. 시간이 중요합니다 ... 85904064 줄 (한 줄에 100 자)로 실제 8GB 파일에서 선호하는 sed 스크립트를 테스트했습니다. 나는 sed를 좋아하지만 sed 스크립트는 매번 전체 파일을 스캔합니다 . 이것은 awk 스크립트보다 평균 두 배 느리게 만듭니다. 발견시 sed 스크립트 두 번째 표현식에 d 대신 aq가 필요할 있다고 생각합니다 . 테스트 결과는 다음과 같습니다 .past .ubuntu.com / 573477 .. 또한 올바른 출력을 생성하지 않습니다. 끝에 asoundmove의 답변에 대한 내 의견을 참조하십시오.
Peter.O

asoundmove의 새로운 sed 버전은 속도 문제를 해결했으며 이제 awks의 속도와 일치합니다. 그리고 새로운 versin은 이제 데이터를 올바르게 출력합니다. 자세한 내용은 주석을 참조하십시오.
Peter.O

방금 "잘라 내기"(일반적으로 제거를 의미 함)라고 말한 것을 보았습니다 ... 정말로 "잘라 내기"를 의미합니까, 아니면 "복사"를 의미합니까? .... "잘라 내기"를 의미했다면 sed쉽게 할 수 있습니다.
Peter.O

답변:


12

같은 것

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"


3
@ dogbane : 예, 예. 편집했습니다. 때로는 최적의 코드보다 적은 코드를 작성한다고 확신합니다.
asoundmove

1
참고 : 동일한 날짜를 가진 연속 된 '첫 번째 날짜'행이 여러 개있는 경우 첫 번째 행을 제외한 모든 행은 삭제 되지 않으며 출력에 소개됩니다 ... 상황)
Peter.O

1
...하지만 ++를 제안했지만이 특정 작업이 자신의 개인 도구 이외의 다른 작업에 대한 한계를 넘어서는 것으로 생각합니다.이 경우 sed의 주요 문제는 다음과 같습니다. 내 .. 나는 당신과 똑같이 sed를 얻을 수있었습니다 .. 또한 1 % 내에서 달렸습니다. .. 주요 문제로 돌아갑니다 .. (awk에는 적용되지 않음) .... 버그 (수정 불가능) : 로그 범위 내에서 유효하지만 실제로 로그에없는 날짜와 관련하여 첫 번째 인수의 경우 sed가 아무것도 인쇄하지 않고 두 번째 arg의 경우 sed는 모든 것을 인쇄합니다 첫 데이트 후! ... 더보기 ...
Peter.O

1
또 다른 수정 가능한 버그 : 데이터 제안을 포함하여 모든 줄의 날짜와 일치하지만 현재 정규 표현식 조정 일뿐입니다.이를 사용하려는 사람은 누구나 args가 첫 번째 및 범위의 마지막 날짜 (-1 및 +1 아님) .. 그리고 마지막으로 .. "정확한 표준"은 내 것이 아닙니다. 나는 질문자 요청의 메신저 일뿐입니다 ... 사용자 요청 한대로 작동하는지 여부 알 수 있습니다 .. 이것은 큰 질문이었습니다 .. 나는 많은 것을 배웠습니다 :) ... 알고 그 sed일치시킬 수 있습니다 awk속도, 그리고 실제로 조금 더 빨랐다.
Peter.O

6

FOO와 BAR 사이의 모든 것을 인쇄하려면 다음을 시도하십시오.

$ sed -n '/FOO/,/BAR/p' file.txt

1
참고 : 연속 된 일련의 BARS 중 첫 번째 BAR 만 인쇄합니다.
Peter.O

또 다른 참고 사항 ... 데이터에 날짜 중 하나가 없으면 큰 문제입니다. 마지막 날짜가 없으면 sed는 EOF에 도달 할 때까지 줄을 계속 출력합니다.
Peter.O

5

이 ... 당신이 원하는 것을 할 것입니다
포함 및 제외 모두 매개 변수 날짜가 표시됩니다.

# 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"
썼다 (

@asoundmove : 그렇습니다. 그것은 더 나아 보일 수 있으며 확실히 더 일반적입니다 . 그러나 실제로, 실행 시간은 1 개의 추가 if명령문 의 지속 시간입니다 (한 줄당 1 개도 아님). 논리 흐름은 사실상 동일하며 실행 시간의 차이는 나노초 단위로 계산됩니다 .... "else"를 사용하지 않은 유일한 이유는 이것이 실제로 첫 번째 스크립트 (4 일 동안 제외)라는 점입니다. 전에 몇 가지 예를 들었을 때) ... 그리고 그것은 내가 찾은 첫 번째 가능한 분기 메커니즘입니다 ... (그리고 언급 한 것처럼 빠릅니다). 나는 일반적으로 Tryawksedq
Peter.O

이 방법에서 텍스트 파일 이름과 위치를 어디에서 제공하는지 이해하지 못합니까? 어리 석음을 통해 누군가 나를 보도록 도울 수 있습니까?
Giles

4

로그 파일에 날짜가이 형식 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
Peter.O

1

이 크기의 파일로 작업하는 것은 항상 어렵습니다.

앞으로이 파일을 몇 개의 작은 파일로 분할하여 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 작업에는 의미가 없지만 검색 패턴이 복잡해지면 더 빨라질 수 있습니다.


3
Johanm, 내 컴퓨터에서 8GB 로그 파일을 검색하는 데 평균 1 분 정도 소요되고 동일한 컴퓨 터에서 초기 파일 분할에만 4 분 43 초 소요 : :)
Peter.O

작은 파일에서 해당 awk 및 sed 시간을 50 % 줄일 수 있다고 가정 해 봅시다. 그렇다면 우리는 총 시간을 얻기 전에 여전히 10 번 이상의 작업을 수행해야합니다. 따라서 파일 분할이 몇 가지 회귀에 대한 최상의 아이디어가 아닐 수도 있습니다.
Johan

awk 스크립트는 하나의 단일 패스로 10 개의 서로 다른 검색 결과를 10 개의 파일로 출력하도록 쉽게 수정할 수 있지만 실제로 보고서를 출력하는 동안 읽기 속도가 느려질 수 있습니다 ... Sed도 같은 작업을 수행 할 수는 있지만 asoundmove의 의견에서 언급했듯이 특정 날짜 / 시간에 로그에 항목이 없으면 sed가 실패합니다 (예 : 시간별로 검색하고 있습니다). sed를 많이 사용하고 매우 유용하지만 한계가 있습니다. ... sed vs awk를 언제 사용해야하는지에 대한 sed FAQ는 다음과 같습니다. 모든 내용에 동의 할 필요는 없지만 sed.sourceforge.net/sedfaq6.html
Peter입니다. O

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.