返回

Sed 命令从网络地址中提取 IP 前三段:分步指南

Linux

使用 Sed 命令从网络地址中提取 IP 前三段

简介

在 Linux 系统中,Sed 命令是一个强大的文本处理工具,可用于高效搜索、替换和修改文本文件。本篇文章将探讨如何使用 Sed 命令从网络地址中提取 IP 地址的前三个段。

问题陈述

假设你有一个网络地址:

192.168.11.12

你的目标是从该地址中提取 "192.168.11." 这部分。

Sed 命令表达式

为了使用 Sed 命令完成此任务,你可以使用以下正则表达式:

s/([0-9]{1,3}\.)([0-9]{1,3}.)([0-9]{1,3}\.)([0-9]{1,3})$/\1\2\3/

此正则表达式的工作原理如下:

  • ([0-9]{1,3}\.):匹配一个包含 1 到 3 位数字的段落,后面跟着一个点号。
  • ([0-9]{1,3}.):匹配第二个类似的段落。
  • ([0-9]{1,3}\.):匹配第三个类似的段落。
  • `([0-9]{1,3})【:匹配第四个类似的段落,后面没有点号。
  • /\1\2\3/:替换匹配内容为前三个段落,即网络地址的前三个段。

示例

让我们使用 Sed 命令测试这个正则表达式:

echo "192.168.11.12" | sed -E 's/([0-9]{1,3}\.)([0-9]{1,3}.)([0-9]{1,3}\.)([0-9]{1,3})$/\1\2\3/'

输出:

192.168.11.

问题解决

管道操作符问题

你可能遇到 Sed 命令不起作用的问题。这可能是由于管道操作符 | 导致的。管道操作符将 hostname 命令的输出作为 Sed 命令的输入。然而,hostname 命令可能不会立即输出,导致 Sed 命令尝试在输出可用之前对其进行操作。

使用反引号解决问题

为了解决此问题,你可以使用反引号 \hostname 命令的结果捕获为一个字符串,然后再将其传递给 Sed 命令:

sed -E 's/([0-9]{1,3}\.)([0-9]{1,3}.)([0-9]{1,3}\.)([0-9]{1,3})$/\1\2\3/' <<< $(hostname -I)

这种方法确保了 hostname 命令的输出在传递给 Sed 命令之前已经准备好。

结论

通过使用适当的 Sed 命令表达式,你可以轻松地从网络地址中提取 IP 地址的前三个段。管道操作符 | 可能导致一些问题,而使用反引号 \ 可以解决这些问题。

常见问题解答

1. 我如何从多个网络地址中提取 IP 前三段?

你可以使用 xargs 命令将 Sed 命令应用于多个网络地址:

cat list_of_addresses.txt | xargs -I {} sed -E 's/([0-9]{1,3}\.)([0-9]{1,3}.)([0-9]{1,3}\.)([0-9]{1,3})$/\1\2\3/'

2. 我如何使用 Sed 命令从 IPv6 地址中提取前三段?

对于 IPv6 地址,可以使用以下正则表达式:

s/([0-9a-fA-F]{1,4}:)(([0-9a-fA-F]{1,4}:)(([0-9a-fA-F]{1,4}:)(([0-9a-fA-F]{1,4}:)(([0-9a-fA-F]{1,4}:)(([0-9a-fA-F]{1,4}:)?/g

3. 我如何从 URL 中提取网络地址?

你可以使用 sed 命令从 URL 中提取网络地址:

sed -E 's/(http(s)?:\/\/)?(([0-9a-fA-F]{1,4}.)(([0-9a-fA-F]{1,4}.)(([0-9a-fA-F]{1,4}.)(([0-9a-fA-F]{1,4}.)?/g

4. 我如何使用 Sed 命令同时提取多个网络地址的前三段?

你可以使用以下正则表达式:

s/(192|172|10)\.([0-9]{1,3})\.([0-9]{1,3})\.[0-9]{1,3}\n/\1.\2.\3 /g

5. 我如何处理带端口号的网络地址?

对于带有端口号的网络地址,可以使用以下正则表达式:

s/((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):[0-9]+)$/\1/g