awk 매칭 문제

awk 매칭 문제

awk를 사용하여 정확한 문자열을 일치시키는 데 문제가 있습니다.

내 목적은 CSV에서 일치 항목을 검색하고 해당 일치 항목의 행 번호를 얻는 것입니다. 따라서 아래 파일에서 "1.1.1.2"를 검색하면 "1"이 반환되기를 원합니다.

CSV

[apache@JBLAMPS001 tmp]$ cat test.csv
node2,1.1.1.2
node20,1.1.1.20
node21,1.1.1.21
node22,1.1.1.22
node102,1.1.1.102
node202,1.1.1.202

내가 시도한 것들

[apache@JBLAMPS001 tmp]$ awk '/'1.1.1.2'/ {print NR}' test.csv
1
2
3
4
5
6

[apache@JBLAMPS001 tmp]$ awk '/\y'1.1.1.2'\y/ {print NR}' test.csv
1
5

[apache@JBLAMPS001 tmp]$ awk '"^1.1.1.2$" {print NR}' test.csv
1
2
3
4
5
6

내가 이걸 어떻게 만들 수 있는지 아는 사람 있나요? 감사해요.

답변1

정규식을 사용하려면 적절한 수정자와 앵커를 사용하여 원하는 일치 항목만 가져와야 합니다. 귀하의 경우 정규식 패턴 1.1.1.2( .단일 문자를 의미)은 모든 줄과 일치하여 결과를 얻습니다. 마지막은 awk '"^1.1.1.2$" {print NR}'정규식 패턴을 넣는 방법이 아닙니다. or 를 awk사용해야 합니다 .//$<field> ~ <pattern>


원하는 결과를 얻는 방법은 다음과 같습니다.

  • 정규식 방식: 문자 .그대로 처리하려면 모든 s를 이스케이프 처리하고 $일치 항목 끝에 추가하세요.

    awk '/1\.1\.1\.2$/ {print NR}' test.csv
    
  • ,문자열 조작: 뒤에 가로 공백으로 구분된 마지막 필드가 있으면 레코드 번호를 인쇄합니다 1.1.1.2.

    awk -F ',[[:blank:]]*' '$NF == "1.1.1.2" {print NR}' test.csv 
    

답변2

ip=1.1.1.2; sed -ne "/,${ip//./\\.}\$/=" yourIPfile

점을 이스케이프 처리 하여 일치하는 줄 번호를 표시하는 .sed 명령에 입력합니다 .=

답변3

언제든지 이전 버전을 사용해 볼 수 있습니다 grep.

grep -wFn 1.1.1.2 yourIPfile

또는

ip=1.1.1.2 ; grep -wFn $ip yourIPfile

두 경우 모두 출력은 다음과 같습니다.

1:node2,1.1.1.2

관련 정보