
다음 명령을 사용하여 필터 기준에 따라 데이터를 추출하려고 시도했지만 awk
작동하지 않습니다. 이 문제를 고칠 수 있나요?
awk -v RS='' -v ORS='\n\n' '/func: peak*down*HIL/' filename
입력하다:
func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date
예상 출력:
func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date
답변1
문제는 정규 표현식에 있습니다. 하위 문자열 사이의 임의의 문자 수와 일치하도록 *
각각 을 바꿔야 합니다 ..*
awk -v RS='' -v ORS='\n\n' '/func: peak.*down.*HIL/' file
각각은 *
표현식의 이전 부분의 동작을 수정하여 0번 이상 일치하도록 합니다. 이 표현식은 , 등 중 하나 peak*down
와 일치합니다 peadown
.peakdown
peakkdown
peakkkdown
파일 형식이 사용하는 것과 동일하기 때문에GNU 슬래시, 저는 개인적으로 데이터를 쿼리(또는 일반적으로 사용)하는 recsel
대신 다음을 사용합니다 .awk
recsel -e 'func ~ "peak.*down.*HIL"' file
범용 텍스트 처리 도구보다 데이터 형식을 이해하는 도구를 사용하는 것이 더 나은 경우가 많습니다(더 쉽고, 더 강력하며, 유지 관리가 더 쉽습니다).