2

我有包含以下内容的文本文件

Pool        p c Dev   Dev             Total  Enabled     Used     Free   a   b
------------ - - ----- ------------ -------- -------- -------- -------- --- ---
FC100        T F FBA   RAID-3(1+1)   13849.1  13849.1  13119.4   7292.0   0 Ena
SATA500      T S FBA   RAID-3(1+1)   50019.2  50019.2  46974.5   3044.9 Ena   0


我想从文件中显示提取 FC100 和 SATA500,因为这两行包含“Ena”。我的批处理脚本经验很少,因此以我有限的知识,我想出了以下脚本。

@ECHO OFF
setlocal enabledelayedexpansion

FOR /F "tokens=1,* delims= " %%a in (list.txt) DO (
    if "%%b" NEQ "" (

        set string=%%b
        set substring= Ena

        echo !string! |findstr "!substring!" > nul
        if errorlevel 1 (
            rem echo !SubString!
        ) else (
            echo %%a
        )
    )
)

上面代码发生的情况是我得到了所需的输出,但我也得到了 Pool,因为该行包含启用的 Ena。如何提取仅包含 Ena 且与 Enabled 不匹配的行。

电流输出

Pool
FC100
SATA500

我尝试对 findstr 使用一些正则表达式魔法,但它不适合我。注意 - 我可以在 Perl 中解决这个问题,但不幸的是我无法在系统上安装 Perl,所以我必须批量执行此操作。

4

4 回答 4

3
@echo off
for /F "skip=1" %%a in ('findstr /C:" Ena" list.txt') do (
   echo %%a
)

编辑: 在任何部分精确寻找带有“Ena”字符串的行的新解决方案

@echo off
for /F %%a in ('findstr /R /C:"\<Ena\>" list.txt') do (
   echo %%a
)
于 2012-12-26T20:16:05.503 回答
2

您可能希望匹配Ena整个单词。为此,您可以用\<and包围您的搜索词\>,即substring像这样更改分配:

set "substring=\<Ena\>"

顺便说一句,可能不需要substring在循环的每次迭代中分配相同的值。您可以在循环之前只分配一次。

于 2012-12-26T20:47:04.323 回答
0

试试这个:

set substring="Ena[^a-zA-Z]"

[^a-zA-Z]指示findstr不要使用在 . 之后包含字母的字符串Ena

于 2012-12-26T19:58:55.690 回答
0

代替

echo !string! |findstr "!substring!" > nul

echo !string! |findstr "!substring!" |findstr /v "Enabled" > nul

甚至更简单:

echo !string! |findstr "Ena" |findstr /v "Enabled" > nul

首先findstr将包括所有带有“Ena”的行,第二个findstr /v将排除所有带有“Enabled”的行。

于 2013-07-29T13:18:30.747 回答