在文本文件中自定义搜索

时间:2013-10-14 17:47:45

标签: batch-file

我有一个包含内容的文字文件:

process.exe Pid:4513
G:\data\Windows
process.exe Pid:6754
G:\data\Linux
process.exe Pid:4328
G:\data\MacOS

我想要一个批处理脚本:

Searches for 1st occurrence of 'process.exe' and then searches for 1st occurrence of any one of the 'Windows/Linux/MacOS' word and let's assume Windows word found then send the following output to a text file 'Output.txt' :
process.exe  Pid:4513  Windows

Then searches for 2nd occurrence of 'process.exe' and then searches again for 1st occurrence of any one of the 'Windows/Linux/MacOS' word and let's assume Linux word found then send the following output to the same text file 'Output.txt' :
process.exe  Pid:6754  Linux

and so on..

最后,' Output.txt'文件应具有以下内容:

process.exe  Pid:4513  Windows
process.exe  Pid:6754  Linux
process.exe  Pid:4328  MacOS

1 个答案:

答案 0 :(得分:2)

虽然这个问题并不严格遵守规则,因为您没有尝试自己解决问题,这不是一个代码为我自由的代码网站;我相信有人在寻找类似问题的解决方案可能会得到答案:

@ECHO OFF
SETLOCAL
SET "keystring1="
(
 FOR /f "delims=" %%a IN (
  q19366050.txt
  ) DO (
  ECHO %%a|FIND "HsvDataSource.exe" >NUL
  IF NOT ERRORLEVEL 1 SET keystring1=%%a
  FOR %%b IN (USHFMPROD GSPROD TLPROD) DO (
   ECHO %%a|FIND "%%b" >NUL
   IF NOT ERRORLEVEL 1 IF DEFINED keystring1 CALL ECHO(%%keystring1%% %%b&SET "keystring1="
  )
 )
)>newfile.txt
TYPE newfile.txt
GOTO :EOF

数据应该在q19366050.txt中,报告在newfile.txt中生成。调整适合自己。


修订速度20131028T0725Z

@ECHO OFF
SETLOCAL
SET "keystring1="
(
 FOR /f "delims=" %%a IN (
  q19366050.txt
  ) DO (
  ECHO %%a|FIND "HsvDataSource.exe" >NUL
  IF ERRORLEVEL 1 (
   IF DEFINED keystring1 (
    FOR %%b IN (USHFMPROD GSPROD TLPROD) DO IF DEFINED keystring1 (
     ECHO %%a|FIND "%%b" >NUL
     IF NOT ERRORLEVEL 1 CALL ECHO(%%keystring1%% %%b&SET "keystring1="
    )
   )
  ) ELSE (SET keystring1=%%a)
 )
)>newfile.txt
TYPE newfile.txt
GOTO :EOF

这里看起来很奇怪的是多次使用IF DEFINED keystring1

第一个实例确保仅在找到可执行文件后才执行内部FOR

下一个实例确保在找到%%b后,不会对剩余的目标字符串执行耗时的代码管道回声。

如果目标字符串按频率顺序列出,则会有一个微小的进一步改善,因此如果字符串出现60%/ 30%/ 10%的时间,那么60%的时间只有1 {{1}将被执行; 2 ECHO 30%和3 ECHO 10%。

样本数据的实际运行时间(并且我没有回忆到我得到的地方......)与原始版本相差80秒,此版本为34秒;使用99K源文本运行。