如何解析MSSQL字符串?提取指定IP与端口方法求助
提取目标IP和端口的MSSQL解决方案
你的现有方法虽然能得到结果,但太依赖日志字符串的空格拆分逻辑——要是日志里多了个空格或者格式微调,这个查询就会失效。这里给你几个更灵活、容错性更强的实现方式:
方法一:用PATINDEX+SUBSTRING精准定位
这种方法不依赖空格拆分,直接锁定ethKASSY:后的IP和端口段,不管前后有没有多余空格都能正常工作:
DECLARE @logStr NVARCHAR(MAX) = '<166>%ASA-6-302013: Built outbound TCP connection 322558458 for ethKASSY:192.168.1.13/10001 (10.21.8.13/10001) to ethASK_EXT_TSSM:10.43.8.24/5508 (192.168.1.10/30475) ' -- 先提取ethKASSY:后面直到左括号的那段内容 DECLARE @targetPart NVARCHAR(100) = SUBSTRING( @logStr, PATINDEX('%ethKASSY:%', @logStr) + 9, -- 跳过"ethKASSY:"的长度 PATINDEX('% (%', @logStr) - (PATINDEX('%ethKASSY:%', @logStr) + 9) ) -- 拆分IP和端口 SELECT LEFT(@targetPart, CHARINDEX('/', @targetPart) - 1) AS IPAddress, RIGHT(@targetPart, LEN(@targetPart) - CHARINDEX('/', @targetPart)) AS Port
思路说明:
- 用
PATINDEX找到ethKASSY:的位置,加上9(这个字符串的长度)定位到目标段的起点 - 再找到第一个
(的位置,算出目标段的长度,提取出192.168.1.13/10001 - 最后用
CHARINDEX找到/的位置,拆分出IP和端口
方法二:改进你的STRING_SPLIT写法
如果还是想保留拆分的思路,可以调整匹配条件,不用精准匹配整个字符串,而是匹配包含目标IP的段:
DECLARE @logStr NVARCHAR(MAX) = '<166>%ASA-6-302013: Built outbound TCP connection 322558458 for ethKASSY:192.168.1.13/10001 (10.21.8.13/10001) to ethASK_EXT_TSSM:10.43.8.24/5508 (192.168.1.10/30475) ' SELECT LEFT(value, CHARINDEX('/', value) - 1) AS IPAddress, RIGHT(value, LEN(value) - CHARINDEX('/', value)) AS Port FROM STRING_SPLIT(@logStr, ' ') WHERE value LIKE 'ethKASSY:%192.168.1.13/%'
这样即使日志里有多余空格,只要目标段的前缀和IP存在,就能匹配到,然后拆分出IP和端口。
方法三:用OPENJSON处理复杂日志(SQL Server 2016+)
如果需要批量处理这类日志,或者要同时提取多个段的信息,可以把字符串转成JSON格式来解析,扩展性更好:
DECLARE @logStr NVARCHAR(MAX) = '<166>%ASA-6-302013: Built outbound TCP connection 322558458 for ethKASSY:192.168.1.13/10001 (10.21.8.13/10001) to ethASK_EXT_TSSM:10.43.8.24/5508 (192.168.1.10/30475) ' -- 提取"for"和"to"之间的内容,转换成JSON数组 DECLARE @json NVARCHAR(MAX) = '["' + REPLACE( SUBSTRING(@logStr, PATINDEX('%for %', @logStr)+4, PATINDEX('% to %', @logStr)-(PATINDEX('%for %', @logStr)+4)), ' ', '","' ) + '"]' SELECT LEFT(value, CHARINDEX('/', value) - 1) AS IPAddress, RIGHT(value, LEN(value) - CHARINDEX('/', value)) AS Port FROM OPENJSON(@json) WHERE value LIKE 'ethKASSY:%'
这个方法适合处理更复杂的日志结构,后续要提取其他段(比如目标IP10.43.8.24)也很方便。
内容的提问来源于stack exchange,提问作者SourceSurfer
相关产品推荐
相关产品推荐

