세미콜론으로 구분된 주소를 추출하고 각 주소를 한 줄에 인쇄합니다.

세미콜론으로 구분된 주소를 추출하고 각 주소를 한 줄에 인쇄합니다.

다음 입력이 포함된 파일이 있습니다. 점으로 구분된 숫자는 주소를 나타냅니다. 주소의 모든 숫자는 다음과 같이 하나 이상의 숫자일 수 있습니다.

[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]

세미콜론과 괄호 없이 각 주소를 추출하고(주소는 세미콜론으로 구분됨 ;) 새 파일의 한 줄에 각 주소를 삽입하여 다음 출력을 생성하려고 합니다.

112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88

첫 번째 단계로 grep을 시도하여 다음과 같이 주소를 추출했습니다.

grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt

그러나 아무것도 인쇄되지 않습니다.

답변1

확장 정규식( -E또는 egrep)은 에 대해 모릅니다 \d. -P@Alexander가 제안한 대로 사용하거나 또는 대신 -E에 사용하세요 .[0-9][[:digit:]]

-o전체 일치하는 줄 대신 일치하는 항목만 선택하려면 추가하세요 . 그러면 단일 일치 항목이 새 줄로 분할됩니다.

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt

또는

grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt

사용하여펄 정규식( -P또는 pgrep):

grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt

+으로 변경하면 *사용할 수도 있습니다.기본 정규식:

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt

답변2

-E다음으로 바꾸고 -P추가하세요 -o.

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt

답변3

사용 awk:

awk 'NF' RS='[][;]' infile

또는 tr첫 번째 빈 줄이 마음에 들지 않으면 다음을 수행하십시오.

tr -s '];[' '\n' <infile

답변4

grep이 작업에는 다소 과잉입니다. tr충분하다:

$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u

중복된 주소를 제거하는 부분 sort -u입니다.

관련 정보