Batch file Findstr查找字符串并打印输出

Batch file Findstr查找字符串并打印输出,batch-file,Batch File,我必须使用批处理文件在.log文件(纯文本)中查找字符串。 它需要找到:(会话ID是令牌: 如果找到,则打印从开始(结束于)的行的其余部分 请帮我做这个。这是.Bat解决方案: set filename="c:\temp\demo.txt" set strToFind="session id" set result="Not Found" for /f "tokens=2 delims=()" %%A in ('findstr %strToFind% %filename%') do (set r

我必须使用批处理文件在.log文件(纯文本)中查找字符串。
它需要找到:
(会话ID是令牌:

如果找到,则打印从开始(结束于)的行的其余部分

请帮我做这个。

这是
.Bat
解决方案:

set filename="c:\temp\demo.txt"
set strToFind="session id"
set result="Not Found"
for /f "tokens=2 delims=()" %%A in ('findstr %strToFind% %filename%') do (set result=%%A) 
echo.%result%
说明:

  • for/f
    -循环执行命令的输出(请参阅)
  • delims=()”
    我们使用括号作为分隔符;例如,
    会话id(hello mum)demo
    =>
    会话id
    hello mum
    demo
    。注意:这并不是很聪明,所以无法识别括号周围的方式,或者它们在字符串中的什么位置(即,他们是在
    会话id
    之前还是之后)。希望这仍然令人满意
  • “tokens=2
    -我们知道在第一个括号(即
    会话id
    )之前会有一些我们不感兴趣的内容;然后是第一个括号(希望是开场白),我们希望所有内容一直到下一个括号(希望是结束括号);之后我们不关心任何事情。因此,我们希望捕获前两个结果,然后停止搜索(我们不关心第一个结果;但我们必须先找到第一个结果,然后再转到第二个结果)。因此,我们需要2个令牌/结果
  • ('..
    ')中的
    %%A
    -将每个令牌依次分配给参数
    %%A
  • findstr%strofind%%filename%
    -返回文本文件(变量
    filename
    中的路径)中包含给定字符串(
    strofind
    )的所有行
  • do(
    -循环遍历每个令牌,执行括号中的操作
  • set result=%%A
    -将找到的令牌分配给
    result
    ,覆盖任何以前的值(即从早期迭代中)

示例文件(
demo.txt
):


PowerShell
中也有相同的功能(允许多个结果)

说明:

  • [string[]$results=
    -将以下操作的结果分配给
    results
    变量(定义为字符串数组)
  • get content-Path$fn
    -获取文件的内容,返回一个字符串数组,其中数组中的每个项都是文本文件中的一行(因为我们没有指定
    -raw
    文件的新行字符被视为分隔符,因此多个字符串而不是一个大字符串)
  • |?{
    ..
    }
    -对于数组中的每个字符串,筛选给定条件为真的字符串。
    (管道)要求获取上一条语句的结果,并对其应用以下逻辑。
    ?{
    ..
    其中对象{
    ..
    }
    的简写
  • $类似于“*会话id*(*)*”
    -条件是一个字符串,包含文本
    会话id
    ,后跟括号(以后可能有几个字符),括号中可能包含其他字符,后面可能跟有其他字符。
    $
    表示数组中的当前项(即,在本例中,我们正在搜索的字符串)。
    *
    是一个通配符,用于表示类似
    的条件,表示任何类型的字符数为零或更多
  • |%{
    .
    }
    -这表示将给定的命令应用于结果(在前面的
    对象
    之后剩余的那些结果)。
    %{
    ..
    }
    是每个对象{
    ..
    }/code>的缩写
  • $-替换“*Session ID.*\(.*?)*”,“$1”
    -这表示使用正则表达式搜索每个字符串,并将其内容替换为字符串
    会话ID
    后面括号中的内容
regex的进一步细分:

  • *
    -任何字符(
    )的零次或多次出现(
    *
  • 会话ID
    -后跟特定字符串
    会话ID
    (powershell默认不区分大小写;我们在前面使用了
    -clike
    进行区分大小写的比较)
  • *
    -后跟任何字符的零次或多次出现
  • \(
    -后接一个左括号。
    \
    用作
    是一个特殊字符(即具有语法意义/功能),因此我们添加斜杠以转义该字符/将其视为文本括号,而不是具有任何特殊意义
  • (.*)
    -后跟零个或多个字符。括号中表示我们希望捕获输出(这就是
    $1
    后面所指的;
    1
    因为这是正则表达式中的第一个捕获语句;如果有更多,下一个将被引用为
    $2
    ,依此类推。
    *
    之后的
    使捕获“非贪婪”-也就是说,只捕捉第一个闭合括号,而不是最后一个;因此
    (hello)mum)
    将具有
    $1=hello
    而不是
    $1=hello)mum
  • \)
    -后跟结束语parenthisis
  • *
    -后跟零个或多个字符

它必须是批处理文件,还是您可以使用PowerShell?(PowerShell对于几乎所有事情来说都更简单、更强大;因此,除非您有充分的理由坚持使用批处理文件,否则这是更好的方法)。我想使用批处理,但如果你用power shell脚本回答,我会很高兴的。XD你会因为这个讨厌我,但是使用批处理,我可以在第一个之后设置一个变量吗:?例如:会话id是令牌:blablablabla:4348237493287到:blablablabla:4348237493287?@JohnLBevanSure;将delims(
()
替换为
)添加
demo text
demo text session id
demo text
demo text (not this one)
demo text
demo text session id (this is something) blah
demo text
demo text session id again
demo text (or this one)
demo
[string]$fn = "C:\temp\demo.txt"
[string[]]$results = get-content -Path $fn `
    | ?{$_ -like '*session id*(*)*'} `
    | %{$_ -replace ".*Session ID.*\((.*?)\).*",'$1'}
$results