AWK: URL을 여러 부분으로 분할하고 인쇄합니다.

AWK: URL을 여러 부분으로 분할하고 인쇄합니다.

나에겐 이 두 가지가 있다

http://www.example.com:8888/index.php

http://home.example.com:8888/index.php( home무엇이든 될 수 있지만 www)

그리고 이것을 얻고 싶습니다 :

example.com

home.example.com

1년 후에 어떻게 작동하는지 이해할 수 있도록 읽을 수 있는 방식으로 하는 것이 좋습니다.

내 시도는 다음과 같습니다.

echo http://www.example.com:8888/index.php | awk -F[/:\'www\'] '{print $7}'

하지만 결과는

.example.com(주의) www.example.com에 적용시

home.example.com사용할 수 있다면 print $4두 경우 모두 동일한 인쇄 절을 사용하는 것을 선호합니다.

감사해요.

답변1

sed해결책:

sed -E 's~http://(www\.)?([^:]+).*~\2~' file
  • ~- sed하위 명령 구분 기호 로 처리됩니다.
  • -E- 확장 정규식 허용
  • (www\.)?- 옵션 www.부품 일치
  • ([^:]+)- 다음을 제외한 모든 문자 시퀀스와 일치합니다.:

산출:

example.com
home.example.com

답변2

세 단계:

  1. ://URL까지 포함하여 모든 항목을 제거합니다.
  2. 첫 번째 문자열 뒤 /또는 나머지 문자열 뒤의 :모든 항목을 제거합니다. 이제 원래 URL의 호스트 이름만 남았습니다.
  3. www.호스트 이름의 시작 부분 과 같이 필요하지 않은 부분을 제거하십시오 .
sed -e 's@^.*://@@' -e 's/[/:].*$//' -e 's/^www\.//'

예제 URL에서 이 명령을 실행하면 다음이 생성됩니다.

example.com
home.example.com

사용 awk:

awk -F'[/:]+' '{ sub("^www\.", "", $2); print $2 }'

:이는 입력 행을 임의 개수의 연속 또는 구분된 필드 레코드로 구성된 것으로 처리합니다 /. 이는 각 행의 두 번째 필드에서 호스트 이름을 사용할 수 있음을 의미합니다.

이렇게 sub()하면 관심이 없는 호스트 이름 부분(여기서는 www.호스트 이름 시작 부분)이 제거됩니다.

답변3

GNU awk 및 해당 필드 패턴 정의 사용 FPAT:

 awk -v FPAT='([^/]+\\.)+[^:/]+' '{print $1}'

/필드 패턴은 다음 점을 제외한 일련의 문자로 설정되며 ., 또는 로 :끝나야 합니다 /.

URL에는 다소 느슨할 수 있지만 포트 번호가 있거나 없는 FQDN을 캡처할 수 있습니다.

관련 정보