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