grep을 사용하여 두 번째 및 다섯 번째 열의 문자열을 일치시키는 정규식

grep을 사용하여 두 번째 및 다섯 번째 열의 문자열을 일치시키는 정규식

다음 문자열이 포함된 파일(test.txt)이 있습니다.

name1,6.5.8.12,specs1,version1,['66.55.89.12']
name2,19.13.13.159,specs2,version2,['13.13.173.59'; '14.19.232.42']
name3,141.101.196.40,specs3,version3,['11.01.196.0']

1) 두 번째와 다섯 번째 열의 모든 문자열을 점으로 구분된 4개의 숫자 형식으로 캡처하고 싶습니다. 각 숫자는 최대 3자리까지 가능합니다.

2) 열 2에는 1개의 문자열이 있고 열 5에는 무한한 문자열이 있지만 세미콜론으로 구분됩니다.

이 명령을 사용하여 다섯 번째 열 문자열을 모두 캡처하려고 시도했지만(두 번째 및 다섯 번째 열을 캡처하는 방법을 알아내야 함) 처음에는 이 명령이 작동하지 않았습니다. 빈 파일이 생성되었습니다.

cat test.txt | cut -d ',' -f5 | grep -P -o '\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}' > result.txt

ng 를 사용하여 두 번째 및 다섯 번째 열의 특수 형식 문자열을 캡처하는 방법 grep. 여기서 string은 점으로 구분된 4개의 숫자(1~3자리)입니다. 두 번째 열에는 하나의 문자열만 있고 다섯 번째 열에는 무한한 문자열이 있지만 세미콜론으로 구분되어 있습니까?

편집하다: 예상 출력:

6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0

또한 나는 결과가 정렬되고 고유하기를 원한다는 점에 유의하십시오 sort -u. 내 예에는 중복 문자열이 없지만 실제 파일에서 중복 문자열이 발견되면 중복을 피하고 싶습니다.

답변1

스키마를 보유할 수 있는 다른 필드가 있습니까(예제에서는 찾을 수 없음)? 그렇지 않다면 시도해보십시오.

grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" file | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12

숫자순으로 정렬하려면 sort-g옵션을 사용하세요.

질문에 제공된 자신만의 솔루션을 보려면 -f2,5입력 cut필드를 사용해 보세요.

답변2

귀하의 회피에 대한 awk정당성이 질문에 제시되어야 하지만 그럼에도 불구하고 귀하는 다음을 수행할 수 있습니다.

$ cut -d, -f2,5 file | egrep -wo '([0-9]{1,3}[.]){3}[0-9]{1,3}'
6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0

출력 정렬+유니크를 원하면 | sort -u파이프 끝에 자신을 추가할 수 있습니다 ;-)

답변3

다음은 다음을 사용하는 단계별 솔루션입니다.cut+tr+sort

먼저 필수 필드를 가져옵니다.

$ cut -d, -f2,5 ip.txt
6.5.8.12,['66.55.89.12']
19.13.13.159,['13.13.173.59'; '14.19.232.42']
141.101.196.40,['11.01.196.0']

그런 다음 불필요한 문자를 모두 제거하십시오.

$ cut -d, -f2,5 ip.txt | tr -d "]'[ "
6.5.8.12,66.55.89.12
19.13.13.159,13.13.173.59;14.19.232.42
141.101.196.40,11.01.196.0

그런 다음 각 값이 자체 줄에 있도록 합계를 줄 바꿈으로 ,변환한 다음 고유하게 정렬합니다.;

$ cut -d, -f2,5 ip.txt | tr -d "]'[ " | tr ',;' '\n' | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12

답변4

내 예를 수정했지만 우아하지는 않습니다.

기본적으로 awk는 필드를 분리하고 sed를 사용하여 원하지 않는 문자를 제거한 다음 출력을 정렬합니다. 죄송합니다. 이 답변에는 grep이 없습니다.

cat test.txt |awk -F'[,;]' '{print $2"\n" $5}'  | sed 's/\(\[\|\]\)//g' |sed "s/'//g" |sort -r

관련 정보