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


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.