awk
구문을 사용하여 명령을 실행하면 NR== /regex/
예상치 못한 결과가 나타납니다. 문서 내용:
cat file
## This is
## a
## b
## c
## end
## e
## f
## g
이제 파일 시작 부분에 빈 줄을 추가합니다.
sed '1 s.^.\n.' file >file2
다음과 같이 또 다른 줄을 추가합니다.
sed '1 s.^.user288752 is back\n.' file2 >file3
이제 세 개의 파일에 대해 다음 명령을 실행합니다.
awk 'NR== /is/, /end/' file
## This is
## a
## b
## c
## end
awk 'NR== /is/, /end/' file2
file2 에 awk
일치하는 항목이 없습니다 .
awk 'NR== /is/, /end/' file3
## user288752 is back
##
## This is
## a
## b
## c
## end
is
제 생각에는 1번째 줄에 나오는 경우에만 일치하는 것 같습니다 . 하지만 저는 $0 ~ /is/
이 명령을 쓰지 않았습니다 . 그리고 is
NR과 같지 않습니다. is
이 경우 regex()라는 것을 알고 있는데 /is/
왜 is
NR과 일치합니까? 내가 무엇을 놓치고 있나요?
답변1
한 번 보자 NR == /is/
.
이는 다음과 같이 다시 작성할 수 있습니다 NR == ( /is/ )
. 이는 두 가지 부울 테스트입니다.
/is/
is
, 문자열이 현재 레코드(행)에 있으면 true입니다.NR == something
, 입력 라인에 있다면 이는 정확합니다something
.
이 awk
언어에서 값은진짜는 1이므로 만약 /is/
그렇다면진짜/is/
, 1이 됩니다. 문자열을 포함하는 각 줄의 표현식은 1 입니다 is
. 첫 번째 파일은 is
라인 1에 있고, 두 번째 파일은 is
라인 2에 있고, 세 번째 파일은 is
라인 1과 3에 있습니다.
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file1
NR: 1 /is/: 1
NR: 2 /is/: 0
NR: 3 /is/: 0
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file2
NR: 1 /is/: 0
NR: 2 /is/: 1
NR: 3 /is/: 0
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
NR: 9 /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file3
NR: 1 /is/: 1
NR: 2 /is/: 0
NR: 3 /is/: 1
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
NR: 9 /is/: 0
NR: 10 /is/: 0
이제 우리는 /is/
일부 라인에서는 1이라는 것을 알고 있습니다. 이는 NR == /is/
테스트가 다음과 같이 진행됨을 의미합니다.진짜/is/
가 1과 동시에 1인 경우 입력 라인이 계산되기 NR
때문에 입력의 첫 번째 라인에만 있을 수 있습니다(있는 경우) .NR
세 개의 파일 중 첫 번째와 마지막 파일은 이 조건을 충족하지만 두 번째 파일은 그렇지 않습니다.