我必须使用批处理文件来查找.log文件中的字符串(纯文本)
它需要找到:
(会话ID是令牌:
如果发现它打印出从开始的其余部分(并以结束)
请帮我这样做。
答案 0 :(得分:2)
这是.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
- 循环输出命令(参见http://ss64.com/nt/for_cmd.html)"
... delims=()"
我们使用括号作为分隔符;即session id (hello mum) demo
=> session id
,hello mum
,demo
。注意:这并不聪明,因此不会识别括号内的哪个方向发生,或者字符串中的位置(即它们是否在session id
之前或之后)。希望这仍然令人满意。"tokens=2
... "
- 我们知道在我们不感兴趣的第一个括号(即session id
)之前会有一些内容;那么第一个支架(希望是揭幕战),我们想要所有内容直到下面的括号(希望是一个近距离支架);之后我们不在乎任何事情。因此,我们希望捕获前两个结果,然后停止搜索(我们不关心第一个结果;但我们必须先找到第一个结果才能继续搜索第二个结果)。因此,我们需要2个令牌/结果。%%A in ('
... ')
- 依次为参数%%A
findstr %strToFind% %filename%
- 返回包含给定字符串(filename
)的文本文件(变量strToFind
中的路径)中的所有行。do (
... )
- 遍历每个令牌,在括号中执行操作set result=%%A
- 将找到的令牌分配给result
覆盖任何先前的值(即来自早期的迭代)。示例文件(demo.txt
):
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
此处PowerShell
中的内容相同(允许多个结果)
[string]$fn = "C:\temp\demo.txt"
[string[]]$results = get-content -Path $fn `
| ?{$_ -like '*session id*(*)*'} `
| %{$_ -replace ".*Session ID.*\((.*?)\).*",'$1'}
$results
说明:
[string[]]$results =
- 将以下操作的结果分配给results
变量(定义为字符串数组)。 get-content -Path $fn
- 获取文件的内容,返回一个字符串数组,其中数组中的每个项目都是文本文件中的一行(因为我们没有指定-raw
文件& #39;新行字符被视为分隔符,因此多个字符串而不是一个大字符串)| ?{
... }
- 对于数组中的每个字符串,过滤给定条件为真的字符串。 |
(管道)说要获取前一个语句的结果并将以下逻辑应用于这些语句。 ?{
... }
是where-object {
... }
的简写。$_ -like '*session id*(*)*'
- 条件是一个字符串,其中包含文本session id
,后面跟着(可能是几个字符)括号,可能包含其他字符,可能后跟其他字符。 $_
表示数组中的当前项(即在这种情况下是我们正在搜索的字符串)。 *
是-like
条件的通配符,表示任何类型的零个或多个字符的位置。| %{
.. }
- 这表示将给定的命令应用于结果(早期where-object
之后的结果)。 %{
... }
是foreach-object{
... }
的简写。$_ -replace ".*Session ID.*\((.*?)\).*",'$1'
- 这表示使用正则表达式搜索每个字符串,并将其内容替换为字符串session id
后面括号内的任何内容。正则表达式的进一步细分:
.*
- 任何字符(*
)的出现次数为零或更多(.
)Session ID
- 后跟特定字符串session id
(PowerShell默认情况下不区分大小写;我们之前使用-clike
进行区分大小写比较)。.*
- 后跟零次或多次出现的任何字符\(
- 后面是一个左括号。 \
用作(
是一个特殊字符(即具有句法意义/功能),因此我们添加斜杠以转义此字符/将其视为文本括号而不是具有任何特殊含义。 (.*?)
- 后跟零个或多个任何字符。围绕这个的括号表示我们要捕获输出(这是$1
后面引用的内容; 1
因为这是我们的正则表达式中的第一个捕获语句;下一个将是更多的引用为$2
,依此类推。?
后.*
进行捕获"非贪婪" - 即仅捕获到第一个近距离而不是最后一个;因此(hello)mum)
将$1=hello
而不是$1=hello)mum
。\)
- 接着是关闭的parenthisis。.*
- 后跟零个或多个任何字符。