AWK:将 URL 拆分为多个部分并打印

AWK:将 URL 拆分为多个部分并打印

我有这两个

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

http://home.example.com:8888/index.phphome可以是任何东西,但www

并想要得到这个:

example.com

home.example.com

最好以某种可读的方式,这样我就可以了解一年后它是如何工作的。

这是我的尝试:

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。

相关内容