특정 문자열이 포함된 7-13행 사이의 행을 인쇄하는 스크립트(.awk)를 작성하려고 합니다. 부분적으로 작동하지만 7-13 사이의 줄뿐만 아니라 해당 문자열을 포함하는 모든 줄을 인쇄합니다.
#!/usr/bin/awk -f
BEGIN { (NR>=7) && (NR<=13) }
/word/ {print $0}
런타임 출력
script.awk filename
다음 단어를 포함하는 모든 줄입니다.
편집하다:
Jeff의 제안을 시도한 후 나는 그의 조언을 얻었습니다. /needle/이 키워드입니다.
문제는 다른 언어에 익숙하기 때문에 다른 줄에 {print $0}이 있다는 것입니다. 코드를 분리하는 것을 좋아합니다
답변1
실행될 "BEGIN" 블록에 행 제한 논리를 배치했습니다.앞으로 awk
모든 데이터를 읽으십시오. 이 논리를 기본 루프로 이동합니다.
NR >= 7 && NR <= 13 && /word/ { print }
$0
주어지지 않은 경우 기본 print
인수입니다...또는 더 짧습니다.
NR >= 7 && NR <= 13 && /word/
지정하지 않으면 이후가 {print}
기본 작업입니다. 스크립트
의 본문은 awk
원하는 작업 앞에 패턴을 추가하려는 "패턴" "작업"의 형태를 취합니다. 여기서 패턴은 세 가지 테스트가 모두 참이어야 하며 작업은 라인을 인쇄하는 것입니다. 별도의 줄에 넣는 것은 print
테스트가 "통과"될 때 "작업"이 없으며 각 줄을 인쇄하는 "모드"가 없어 모든 줄이 인쇄된다는 의미입니다.
답변2
그냥 보충제제프의 대답그 중 하나는 다음과 같습니다 sed
.
sed -n '7,13 { /expression/ p; }' <file
그러면 정규식과 일치하는 7행과 13행(포함) 사이의 모든 행이 인쇄됩니다 expression
. 출력은 기본적으로 꺼져 있으므로 -n
명령을 사용하여 명시적으로 인쇄된 행만 p
출력됩니다.
위 스크립트를 sed
다음으로 직접 번역하세요 awk
.
awk 'NR == 7, NR == 13 { if (/expression/) print }' <file
이 조건은 "7의 입력 레코드에서 13의 입력 레코드까지 NR == 7, NR == 13
"로 이해되어야 합니다 . 여기서 "입력 레코드"는 기본적으로 지금까지 읽은 레코드(라인) 수인 한 라인으로 설정됩니다.NR
NR
NR
답변3
어때요?
awk 'NR>6&&NR<14&&/word/' file