2017-11-21 4 views
0
saaa vcahJJ HKak vk  
Import xxx xXXXXX xxxx 
aaaa aaaa aaaa ffffff 
hhhhhh hhhhhh hhh hhh hhhhhh 
Error reading readStatus api 
aaa hhhh aaa aaaaa 
gggggggg ggggg xxxxxxxxxx 
uuuu hhhhhhhh fffffffff 
query run ends 
qidIdih II v iQE Iqe 

아래에 포함 된 모든 라인을 인쇄 할 수 있습니다. 어떻게 할 수 있습니까? grep/sed 시도 this 하지만 많이 얻지는 못했습니다. 참고 : 전후에 줄 수를 알지 못합니다. 위의 샘플과 다를 수 있습니다.그렙와 내가 위의 로그를 포함하는 파일의 <code>'Error'</code> 문자열을 찾은 다음 두 문자열 <code>'Import'</code> 및 <code>'ends'</code> 사이에 사용할 수있는 모든 정보를 인쇄 할 2 문자열 위 오류

+0

당신은 당신이 무엇을하려고 않았다 게시 할 수 있습니까? –

+0

awk '/^Error /'ORS = 'ends'file.txt --- 성공하지 못했습니다. –

+0

@ tripleee, 두 개의 표식 사이에 중복이 있는지 모르겠지만 여기에 조건이 하나 더 있습니다. –

답변

0

Grep의 -A 1 옵션을 사용하면 한 줄을 줄 수 있습니다. -B 1은 이전에 한 줄을 제공합니다. -C 1은 둘 다 결합하여 전후에 한 줄을 제공합니다.

grep -C 1 "Error" <logfile> 

귀하의 요구 사항에 따라, 당신은 use- 수

sed -n '/Import/,/ends/p' filename 
+0

미안하지만 내 쿼리에서 미안함이 없다. 내가 제공 한 샘플과 다를 수있다. –

+0

'가져 오기'와 '끝'을 구체적으로 확인하고 이들 사이의 내용을 grep합니다. –

+0

예. 답변을 편집했습니다. – Abhijeetk431

0

방법에 대해 :

$ awk 'BEGIN{RS=ORS="ends\n"} /Error/' file 

RSends 할 필요가 입력 레코드 분리입니다. ORS은 출력 목적으로 같은 값을 얻습니다. 또한 예는 /^Error/이지만 Error은 레코드를 시작하지 않습니다 (^). 여기

+0

'가져 오기'줄 앞에 더 많은 줄이 있다면 어떻게해야합니까? –

+0

실제 상황을 반영하도록 샘플 데이터를 업데이트하십시오. 추측 게임은 모든 사람의 시간 낭비이기 때문에 여기에서 평가하지 않습니다. –

0

당신은 다음과 같습니다

out=$(sed -n '/^Import/,/end$/p' file) 
echo "$out" | grep Error >/dev/null && echo "$out" 

이 "가져 오기"와 "끝"사이의 텍스트를 캡처하고, 추출 된 텍스트가 "오류"를 포함 경우에만 인쇄됩니다. 당신은이

sed '/^Import/!d;:A;N;/\nImport/{h;s/.*\n//;bA};/ends$/!bA;h;s/\nError//;tB;d;:B;x' infile 

설명을 나오지도 시도 할 수

+0

이것은 제 요구 사항에 부합했습니다. 감사 –

0

:

sed ' 
/^Import/!d     # if a line start with Import 
:A 
N       # get an other line 
/\nImport/{h;s/.*\n//;bA} # if the last line start with Import 
          # keep only this last line and return to A 
/ends$/!bA     # If the last line end with ends 
h       # keep all the lines in the hold space 
s/\nError//     # look for a line which start with Error 
tB       # if find jump to B 
d       # not find, delete all and return to the start 
:B 
x       # restore all the lines and print 
' infile 
관련 문제