需要一点帮助批量过滤行

时间:2012-12-26 19:30:51

标签: batch-file

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

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 in Enabled。如何提取仅包含Ena且与Enabled不匹配的行。

当前输出

Pool
FC100
SATA500

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

4 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:2)

您可能希望将Ena作为整个单词进行匹配。为此,您可以使用\<\>包围搜索字词,即更改substring分配,如下所示:

set "substring=\<Ena\>"

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

答案 2 :(得分:0)

试试这个:

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

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

答案 3 :(得分: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将排除所有包含“已启用”的行。