在字符串中的特定字符集后查找值

时间:2017-11-11 09:08:48

标签: string batch-file find

所以我希望运行一个批处理文件,它可以从字符串中提取特定变量的值。例如:

[2017-11-03T12:18:56.263733+00:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: XDS.0000.0000.0000.0001] [File: CHsvDSSystemInfo.cpp] [Line: 6002] [userId: ] [appName: GGCOST] [pid: 9640] [tid: 6632] [host: AWEU1ORHYAP05P] [nwaddr: 172.20.36.105:0;] [errorCode: 0] [srcException: NotSpec] [errType: 1] [dbUpdate: 1] [11.1.2.4.202.5211]  [[SYSINFO:Application=GGCOST; PID=9640; NumUsers=0; CPU(Cores)=8; NumTasks=0; NumErrors=1; PhysicalMem=60129071104; UsedPhysicalMem=38635540480; ProcUsedPhysicalMem=3277619200; VirtualMem=140737488224256; UsedVirtualMem=5590806528; ProcUsedVirtualMem=3582775296; UsedCPU=9.3284; ProcUsedCPU=56.3594; NumCubesInRAM=7007; NumDataRecordsInRAM=1693604; NumRecordsInLargestCube=92334]]  

从上面的字符串中,我希望提取pid编号,在这种情况下是6212.可以通过批处理脚本完成吗?

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "var=[2017-11-11T07:27:23.088173+00:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: ] [File: XFMDataSource.cpp] [Line: 508] [userId: ] [Msg arguments: ] [appName: MyApp] [pid: 6212] [tid: 3176] [host: Server1] [nwaddr: 172.24.62.192:0;] [errorCode: 0] [srcException: NotSpec] [errType: 1] [[XDS: XFMDataSource process exiting now ...]] "
SET "var1=%var:(= %"
SET "var1=%var1:)= %"
SET "result=not found "
FOR %%a IN (%var1%) DO IF "%%a"=="[pid:" (
  SET "result="
 ) ELSE ( 
  IF NOT defined result SET result=%%a
 )
SET "result=%result:~0,-1%"

ECHO result is %result%

GOTO :EOF

所以是的,这是可能的。这是众多方式之一。

首先将result设置为报告字符串,然后使用字符串for上的标准var功能。找到前导字符串[pid:后,将result设置为 nothing ,以便for将下一个字符串发送到%%a,{{1 }将是未定义的,result将不是%%a - 然后将[pid:设置为找到的字符串(这意味着result现在已定义)

处理完剩余的字符串后,只需从result中删除最终字符。

另一种方法是

result

会用 nothing 替换FOR %%a IN (%var:]=%) DO IF "%%a"=="[pid:" ( 字符,这意味着设置为]的值不需要删除最后一个字符,因此{{1}不需要跟随result循环。

我已插入两行以删除setfor,这会导致您发布的新数据出现问题。请注意,派生并处理了一个新变量(

有许多字符导致)问题并需要特殊处理。如果var1被调用,cmd将导致问题,但我们需要在设计解决方案之前了解此类信息,因为它 a 会影响代码必需的。

代码将在变量中的字符串! last 外观后面找到字符串。 delayedexpansion后面的字符串将被忽略。

答案 1 :(得分:1)

另一种方法I learned just yesterday

@echo off

>t.txt echo [2017-11-03T12:18:56.263733+00:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: XDS.0000.0000.0000.0001] [File: CHsvDSSystemInfo.cpp] [Line: 6002] [userId: ] [appName: GGCOST] [pid: 9640] [tid: 6632] [host: AWEU1ORHYAP05P] [nwaddr: 172.20.36.105:0;] [errorCode: 0] [srcException: NotSpec] [errType: 1] [dbUpdate: 1] [11.1.2.4.202.5211]  [[SYSINFO:Application=GGCOST; PID=9640; NumUsers=0; CPU(Cores)=8; NumTasks=0; NumErrors=1; PhysicalMem=60129071104; UsedPhysicalMem=38635540480; ProcUsedPhysicalMem=3277619200; VirtualMem=140737488224256; UsedVirtualMem=5590806528; ProcUsedVirtualMem=3582775296; UsedCPU=9.3284; ProcUsedCPU=56.3594; NumCubesInRAM=7007; NumDataRecordsInRAM=1693604; NumRecordsInLargestCube=92334]]

for /F "tokens=3" %%a in ('"setx /F t.txt /D ] dummyVar /R 0,1 [pid:"') do set "var=%%a" & goto continue
:continue
set "var=%var:~0,-1%"
echo %var%

缺点:需要一个文件;创建一个永久环境变量(当然可以轻松删除)