0

我有一个文件,我在其中存储 tnsping 的输出,该文件将包含以下文本:

适用于 32 位 Windows 的 TNS Ping 实用程序:版本 10.1.0.4.2 - 2013 年 8 月 12 日 11:28:33 生产

版权所有 (c) 1997、2003,甲骨文。版权所有。

使用的参数文件:
D:\oracle\Home_1\network\admin\sqlnet.ora


使用 TNSNAMES 适配器解析别名
尝试联系 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.184.10.90)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL)))
正常(0 毫秒)

我需要通过批处理文件提取 HOST、PORT、SERVICE_NAME 的值。我期望的值为10.184.10.90HOST、1521PORT 和ORCLSERVICE_NAME。

苏吉特

4

2 回答 2

0
@ECHO OFF &SETLOCAL
FOR /f "delims=" %%a  IN ('findstr "Attempting to contact" "file"') DO SET "line=%%a"
SET "line=%line:*HOST=%"
FOR /f "tokens=2delims==)" %%a IN ("%line%") DO FOR %%b IN (%%a) DO SET "host=%%b"
SET "line=%line:*PORT=%"
FOR /f "tokens=2delims==)" %%a IN ("%line%") DO FOR %%b IN (%%a) DO SET "port=%%b"
SET "line=%line:*SERVICE_NAME=%"
FOR /f "tokens=2delims==)" %%a IN ("%line%") DO FOR %%b IN (%%a) DO SET "SERVICE_NAME=%%b"
ECHO HOST:%host% PORT:%port% SERVICE_NAME:%SERVICE_NAME%

最好为此使用sed

于 2013-08-12T06:33:18.580 回答
0

这会过滤包含单词“Attempting”的行并将其拆分为由分隔符) =和空格分隔的标记

您可以从行的左端开始计数,行的第 9、第 11 和第 14 部分由“)=”分隔是您想要在变量中的项目。每个令牌都%%a %%b %%c按顺序应用。

删除这些echo部分,它们将设置变量。

@echo off
for /f "tokens=9,11,14 delims=)= " %%a in ('type "file.txt" ^| find "Attempting"') do (
echo set "HOST=%%a"
echo set "PORT=%%b"
echo set "SERVICE_NAME=%%c"
)
pause

描述令牌:

如果您有这样的字符串,=abc = def=ghi并且应用空格和等于的分隔符,= 那么剩下的部分是“abc”“def”“ghi”(不带引号),它们将这些部分称为“令牌”。如果你使用tokens=2,那么在这种情况下 %%a 将被设置为def

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.184.10.90)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL)))

当使用 )= 和空格的分隔符时,上面的这一行将具有下面的标记,如果计算它们,那么 IP 地址是第 9 个标记。请注意,)= 和空格的分隔符已经消失,因为这是分隔符的目的。

Attempting
to
contact
(DESCRIPTION
(ADDRESS
(PROTOCOL
TCP
(HOST
10.184.10.90
(PORT
1521
(CONNECT_DATA
(SERVICE_NAME
ORCL

我希望这很清楚。

于 2013-08-12T09:02:06.273 回答