섹션 사이의 줄을 찾기 위해 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_1039
chunkbig10_
이것이 당신이 원하는 것이 아니라면, 제발편집하다귀하의 질문은 귀하가 원하는 것을 더 명확하게 설명합니다.
한 번의 호출로 이 작업을 수행할 수 있습니다 sed
.
sed -n '/chunkbig10_1039/,/chunkbig10_/ { /eppix/p }' infile
sed n
"모든 것을 인쇄하지 말고, 우리가 인쇄한 내용만 인쇄하세요."라는 뜻입니다./eppix/p
"다음eppix
을 포함하는 모든 줄을 인쇄한다"는 뜻이고/chunkbig10_1039/,/chunkbig10_/ { … }
"첫 번째 일치 항목과 다음 일치 항목 사이의 행에서만 명령을 실행하십시오{
."를 의미합니다.}
chunkbig10_1039
chunkbig10_
나는 내 가정과 그 부족함을 보여주는 더 간단하고 읽기 쉬운 입력 파일을 만들었습니다.
$ 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'