다음 일치 조건을 파악하는 방법

다음 일치 조건을 파악하는 방법

섹션 사이의 줄을 찾기 위해 grep에 몇 가지 논리가 필요한 작업이 있습니다.

내 파일에 다음 내용이 있습니다.

1856 /dev/informix/chunkbig10_1039

eppix:'informix'.lsc_ix1 212995
eppix:'informix'.api_valid_token 213201
eppix:'informix'.leads_reasons 213841
eppix:'informix'.epx_vas_sms 214481
eppix:'informix'.lsc_ix1 215121
eppix:'informix'.lsc_ix1 287926
eppix:'informix'.cn_clawback_idx 288750
eppix:'informix'.consent_types_idx 288782
eppix:'informix'.lsc_ix1 288850



1936 /dev/informix/chunkbig10_1119




1937 /dev/informix/chunkbig10_1120




1981 /dev/informix/chunkbig10_1164




1982 /dev/informix/chunkbig10_1165

파일에서 추출해야 하는 것은 Chunkbig10_1039를 grep하면 모든 줄 eppix*를 인쇄하고 싶지만 이를 달성하는 방법을 어디서부터 시작해야 할지조차 모른다는 것입니다. 문제는 eppix를 찾기 위해 grep을 할 수 없다는 것입니다. 왜냐하면 간단하다면 무엇이든 될 수 있지만 예제가 아니기 때문입니다.

답변1

$ awk '$1~/^[0-9]+$/{ f=/chunkbig10_1039/; next } f && NF' file
eppix:'informix'.lsc_ix1 212995
eppix:'informix'.api_valid_token 213201
eppix:'informix'.leads_reasons 213841
eppix:'informix'.epx_vas_sms 214481
eppix:'informix'.lsc_ix1 215121
eppix:'informix'.lsc_ix1 287926
eppix:'informix'.cn_clawback_idx 288750
eppix:'informix'.consent_types_idx 288782
eppix:'informix'.lsc_ix1 288850

답변2

당신은 말한다

...모든 줄을 인쇄하고 싶습니다. eppix*...

글쎄, αГsнιι가 지적했듯이 (주어진 입력에 대해) 다음을 사용할 수 있습니다.

grep 'eppix' infile

실제로,주어진 입력에 대해,원하는 결과를 얻을 수 있습니다

printf "eppix:'informix'.%s\n" 'lsc_ix1 212995' 'api_valid_token 213201' 'leads_reasons 213841' \
                        'epx_vas_sms 214481' 'lsc_ix1 215121' 'lsc_ix1 287926' \
                        'cn_clawback_idx 288750' 'consent_types_idx 288782' 'lsc_ix1 288850'

근데 너도 말했잖아

...grep은 섹션 사이의 줄을 찾습니다.

그래서 나는추측하다chunkbig10_1039당신이 의미하는 바는 검색을 과 next 사이의 행 으로 제한한다는 것입니다 chunkbig10_. 그리고, 네가 말한 이후로

...모든 줄을 인쇄하고 싶습니다. eppix*...

나는 과 next eppix 사이에 포함된 모든 줄을 인쇄하려고 하며 거기에 비어 있지 않은 다른 줄이 있을 수 있다는 급진적인 가정을 할 것입니다 .chunkbig10_1039chunkbig10_

이것이 당신이 원하는 것이 아니라면, 제발편집하다귀하의 질문은 귀하가 원하는 것을 더 명확하게 설명합니다.

한 번의 호출로 이 작업을 수행할 수 있습니다 sed.

sed -n '/chunkbig10_1039/,/chunkbig10_/ { /eppix/p }' infile
  • sed n"모든 것을 인쇄하지 말고, 우리가 인쇄한 내용만 인쇄하세요."라는 뜻입니다.
  • /eppix/p"다음 eppix을 포함하는 모든 줄을 인쇄한다"는 뜻이고
  • /chunkbig10_1039/,/chunkbig10_/ { … }"첫 번째 일치 항목과 다음 일치 항목 사이의 행에서만 명령을 실행하십시오 {."를 의미합니다.}chunkbig10_1039chunkbig10_

나는 내 가정과 그 부족함을 보여주는 더 간단하고 읽기 쉬운 입력 파일을 만들었습니다.

$ cat infile
eppix ant
chunkbig10_1
bat
eppix cat
dog
eppix elk

chunkbig10_2
eppix fox
gopher
horse
chunkbig10_3
impala
eppix jaguar
kangaroo
eppix llama

$ sed -n '/chunkbig10_1/,/chunkbig10_/ { /eppix/p }' infile
eppix cat
eppix elk

$ sed -n '/chunkbig10_2/,/chunkbig10_/ { /eppix/p }' infile
eppix fox

$ sed -n '/chunkbig10_3/,/chunkbig10_/ { /eppix/p }' infile
eppix jaguar
eppix llama
  • 일치하는 행만 찾고 싶은 경우시작말하자면 eppix.
  • "섹션"에서 비어 있지 않은 줄을 모두 찾으려면 그렇게 말하세요.
  • 행을 포함했다면 chunkbig10_1039 foo그렇게 말해주세요.
  • chunkbig10_1039bar (또는 )이 포함된 chunkbig10_103942줄이 있는 경우 표시해 주세요.
  • 만약에
    chunkbig10_2
    
    섹션이 끝나는 것은 아니지만 그래야 합니다.
    1983 /dev/informix/chunkbig10_2
    
    그렇게 말했다.
  • 행에 다음이 포함될 수 있는 경우chunkbig10_ 그리고 eppix, 그들과 함께 무엇을 하고 싶은지 말해보세요.

답변3

sed -n -e '/chunkbig10_1039/,/chunkbig10_*/ p' test|grep -v 'chunkbig'

관련 정보