【问题标题】:Extract few characters from a string从字符串中提取几个字符
【发布时间】:2019-11-20 13:26:07
【问题描述】:

我正在尝试找到一种方法来从以关键字开头并以“.net”结尾的字符串(列)中提取几个字符

字符串

Source: epw050015.catxtx.net
Description: vCenter: 198.11.12.98
alarm.NetworkConnectivityLostAlarm - Event: Lost Network Connectivity (11355590)
Summary: Lost network connectivity on virtual switch  vSwitchiDRACvusb . Physical NIC vusb0 is down. Affected portgroups: iDRAC Network .
Date: 02/06/19 12:28:04
Host: epw050015.catxtx.net
Resource pool: W05P006 (6.5) GAD
Data center: W05

从上面的字符串;我正在尝试提取出现在 "Host:" 直到 ".net"

之后的字符

输出应该是:epw050015.catxtx.net

注意:在字符串中,Host: 后面的值可能有超过一/两个空格。一个例子 - 主机:epw050015.catxtx.net

提前感谢您的帮助!

【问题讨论】:

  • select substr ('来源:epw050015.catxtx.net 描述:vCenter:198.11.12.98 alarm.NetworkConnectivityLostAlarm - 事件:丢失网络连接 (11355590) 摘要:虚拟交换机 vSwitchiDRACvusb 上丢失网络连接。物理 NIC vusb0 已关闭。受影响的端口组:iDRAC 网络。日期:02/06/19 12:28:04 主机:epw050015.catxtx.net 资源池:W05P006 (6.5) GAD 数据中心:W05', INSTR('Host: ltdevmq01. bmwgroup.net 服务:os_linux_default_check_shell',' ',1)+1) 来自双重;这是我能想到的。

标签: sql oracle substring


【解决方案1】:

Oracle 设置

CREATE TABLE test_data ( value ) AS
SELECT 'Source: epw050015.catxtx.net
Description: vCenter: 198.11.12.98
alarm.NetworkConnectivityLostAlarm - Event: Lost Network Connectivity (11355590)
Summary: Lost network connectivity on virtual switch  vSwitchiDRACvusb . Physical NIC vusb0 is down. Affected portgroups: iDRAC Network .
Date: 02/06/19 12:28:04
Host: epw050015.catxtx.net
Resource pool: W05P006 (6.5) GAD
Data center: W05' FROM DUAL

查询 1

在文本中找到Host:子串(在行首)结尾的索引,然后找到后续换行的索引,然后得到两者之间的子串:

SELECT TRIM( SUBSTR( value, start_host, end_host - start_host ) ) AS host
FROM   (
  SELECT value,
         INSTR( value, CHR(10)||'Host:' ) + 6 AS start_host,
         INSTR( value, CHR(10), INSTR( value, CHR(10)||'Host:' ) + 6 ) AS end_host
  FROM   test_data
)

查询 2

或者你可以使用正则表达式,这可能是一个较慢的解决方案,但代码更简单:

SELECT REGEXP_SUBSTR( value, '^Host:\s+(.*?)$', 1, 1, 'm', 1 ) AS host
FROM   test_data

输出

两种解决方案的输出:

|主持人 | | :-------------------- | | epw050015.catxtx.net |

db小提琴here

【讨论】:

  • 谢谢,MT0。查询 2 似乎可以解决问题。让我在我的查询中实现它;我会尽快回复您并提供更新。
  • 这是输出获取额外工作的一种情况列值:主机:liapp419vm.catxtx.net 错误:qqosm00@liapp419vm:/www/osmaster> ./GFserver4 stop -i 0 输出:liapp419vm.bmwgroup。净错误:
  • @Praveen 请不要将数据发布为 cmets(特别是如果它应该有换行符),而是 edit 您的问题并使用 {} 代码标记来澄清您的问题。最好将数据添加为 DML 语句,我们可以运行它们并轻松解决您的问题。
【解决方案2】:

试试这个:

SELECT TRIM(SUBSTR(COLUM_NAME, INSTR(COLUM_NAME,'Host:') + LENGTH('Host:'), INSTR(COLUM_NAME,'.net') - INSTR(COLUM_NAME,'Host:') - LENGTH('Host:') + LENGTH('.net'))) FROM TABLE_NAME

你可以在这里看到它的实际效果:http://sqlfiddle.com/#!4/9f207/4/0

这会找到Host:position.netposition + length('.net') 之间的字符串。然后TRIM 函数删除侧面的任何空格,正如你所说,Host: 之后可能有多个空格

【讨论】:

  • 如果Host: 行总是紧跟Resource pool: 行,这很好,但如果Host:Resource pool: 行被交换或者Resource pool: 行将不起作用某些错误消息缺少行,或者如果在两者之间引入了另一行,或者字符串 Resource 出现在文本前面的任何其他位置。
  • 感谢您指出这一点。我修改了代码,所以现在它可以在没有Resource 字的情况下工作。 @MT0
  • 感谢@Hackinet 的输入 :) 尝试实施您在我的查询中提出的建议;它可以正确提取所需的字符,但在少数情况下它不起作用。场景 1:列值 (1) vCenter:160.96.181.43 目标对象:epmuc0416.catxtx.net alarm.NetworkRedundancyLostAlarm - 事件:丢失网络冗余 (83327966) 日期:2019 年 11 月 12 日 14:15:16 主机:epmuc0416.catxtx。 net 资源池:MUCP095 (6.5) GAD 数据中心:MUC 输出 ---
  • 场景 2:如果列值包含 .net 但关键字“主机:”不存在 列值 (2):由于负载问题,我们收到了以下主机的多个事件:请检查以下主机的问题:lpapp144.catxtx.net lpapp149.catxtx.net lpapp153.catxtx.net 输出 - 由于负载问题,我们收到了以下主机的多个事件:请检查以下主机的问题:lpapp144.catxtx .net
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多