0

我有看起来像这样的简单文件:

提交日志

Submitting job(s)..
2 job(s) submitted to cluster 528.
Submitting job(s)..
2 job(s) submitted to cluster 529.

然后我只需要输出第二行(集群)的最后一个数字,在这种情况下,所需的输出将是:

528
529

我尝试使用下面的脚本,但我不知道为什么它不起作用。我需要使用批处理来完成,这是我们系统的限制。

@ECHO OFF
FOR /F "tokens=6" %%g IN (Submit.log) DO (
set Job=%%g
echo %Job:.=%
)

一个优雅的解决方案绝对是一个加分项,但如果有人可以通过一个简单的解决方案帮助我,我将不胜感激。

4

2 回答 2

1

以下脚本将完成这项工作:

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=1-6" %%a IN (submit.log) do (
    if %%c==submitted (
        set job=%%f
        echo !job:.=!
    )
)
endlocal

而且,由于我基本上是谦虚的类型,我不会争辩说它既优雅简单:-)

它基本上只查看第三个单词所在的那些行submitted(如果这证明有问题,您也可以使用其他规则),然后修改并输出第六个单词。

请注意延迟扩展的使用(使用!而不是%),这是确保在循环开始之前不评估变量所必需的。

于 2012-04-05T03:17:44.213 回答
1

这是一个有效的衬里。FINDSTR 搜索可以很容易地进行调整以使搜索非常精确。

@echo off
for /f "tokens=6 delims=. " %%N in ('findstr /c:"submitted to cluster" "submit.log"') do echo %%N

paxdiablo 解决方案也可以简化,因此它不需要修改值,因此不需要延迟扩展。无需捕获所有令牌,只需捕获您要使用的令牌即可。分隔符设置为查找点和空格(默认为空格和制表符)。正如 paxdiablo 所说,可以测试更多的令牌以使搜索更精确,但这不如 FINDSTR 方便。

@echo off
for /f "tokens=5,6 delims=. " %%A in (submit.log) do if %%A==cluster echo %%B
于 2012-04-05T11:20:55.133 回答