Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何打印日志文件中特定单词后到段落末尾的所有行?_Windows_Batch File_Text - Fatal编程技术网

Windows 如何打印日志文件中特定单词后到段落末尾的所有行?

Windows 如何打印日志文件中特定单词后到段落末尾的所有行?,windows,batch-file,text,Windows,Batch File,Text,我有一个如下所示的日志文件: Beginning difffull backup for database Managed_Metadata_Service, 3 of 149. Full: 0 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec Full: 4 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec Backup of Managed_Metadata_Service failed. ANS0238E (RC2

我有一个如下所示的日志文件:

Beginning difffull backup for database Managed_Metadata_Service, 3 of 149.
Full: 0   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Full: 4   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Backup of Managed_Metadata_Service failed.
ANS0238E (RC2041) The sequence of calls is invalid.

Beginning difffull backup for database model, 4 of 149.
Full: 0   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Full: 2   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Full: 4   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Backup of model failed.
ANS0238E (RC2041) The sequence of calls is invalid.

Beginning difffull backup for database msdb, 5 of 149.
Full: 0   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Full: 4   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Backup of msdb failed.
ANS0238E (RC2041) The sequence of calls is invalid.

Beginning difffull backup for database Search_Service_Application_AnalyticsReportingStoreDB, 6 of 149.
Full: 0   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Full: 4   Read: 6144  Written: 0  Rate: 0.00 Kb/Sec
Backup of Search_Service_Application_AnalyticsReportingStoreDB failed.
ANS0238E (RC2041) The sequence of calls is invalid.
我怎样才能找到所有出现的失败,然后用这个词打印这一行和下一行,直到消息结束,也就是说,直到段落末尾或文件末尾的下一个点

结果如下:

Backup of Managed_Metadata_Service failed. 
ANS0238E (RC2041) The sequence of calls is invalid.
.
.
Search_Service_Application_AnalyticsReportingStoreDB failed. 
ANS0238E (RC2041) The sequence of calls is invalid.
对于包含失败字的所有行

以下是我目前掌握的代码:

@echo off
setlocal EnableDelayedExpansion
set numbers=
for /F "delims=^" %%a in ('findstr /I /N /C:"failed" Backup_DIFF_2017-12-14.log') do (
    set /A sameline=%%a, after=%%a+1
    set "numbers=!numbers!!sameline!: !after!: "
)
rem Search for the lines
(
    for /F "tokens=* delims=^ %%a in ('findstr /N "^" Backup_DIFF_2017-12-14.log ^| findstr /B "%numbers%"') do echo %%b
) > result.txt

对于此日志文件示例,建议的简单解决方案是:

@%SystemRoot%\System32\findstr.exe "failed\.$ ^ANS" "Backup_DIFF_2017-12-14.log"
这个命令行输出:

Backup of Managed_Metadata_Service failed.
ANS0238E (RC2041) The sequence of calls is invalid.
Backup of model failed.
ANS0238E (RC2041) The sequence of calls is invalid.
Backup of msdb failed.
ANS0238E (RC2041) The sequence of calls is invalid.
Backup of Search_Service_Application_AnalyticsReportingStoreDB failed.
ANS0238E (RC2041) The sequence of calls is invalid.
FINDSTR搜索以失败结尾的行。或以ANS开头并输出这些行的行。点必须位于正则表达式搜索字符串中,并带有反斜杠才能解释为文字字符。FINDSTR不支持多行正则表达式搜索

Alternate FINDSTR命令行也在每行上运行两个正则表达式搜索或组合搜索:

@%SystemRoot%\System32\findstr.exe /R /C:failed\.$ /C:^ANS "Backup_DIFF_2017-12-14.log"
更复杂的解决方案是使用此批处理代码:

@echo off
if not exist "Backup_DIFF_2017-12-14.log" goto :EOF

setlocal EnableExtensions EnableDelayedExpansion
set "PrintLines="

for /F "tokens=1* delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /N /R "^" "Backup_DIFF_2017-12-14.log"') do (
    if "%%J" == "" (
        set "PrintLines="
    ) else (
        set "Line=%%J"
        if not "!Line:failed=!" == "!Line!" set "PrintLines=1"
    )
    if defined PrintLines echo %%J
)

endlocal
输出是相同的。这段代码输出包含任何不区分大小写失败的行,并将这一行以及所有其他行输出到文件中的下一个空行。空行不包含任何字符,甚至不包含空格或水平制表符

此代码有两个问题:

以一个或多个冒号开头的行是不正确的输出,因为一行开头的所有冒号都被delims=删除:FINDSTR需要用行号、冒号和行本身拆分每行输出。 FINDSTR用于处理甚至空行,因为在文件上运行FINDSTR搜索一行的开头后,所有行(包括空行)都以行号和冒号开头,这会导致每一行的正匹配。 包含一个或多个感叹号的行输出不正确,因为在用文件中的行替换%%J后,在命令行set line=%%J上应用了启用的延迟环境变量扩展。 另一个并非100%完美的解决方案:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "PrintLines="

for /F "usebackq delims=" %%I in ("Backup_DIFF_2017-12-14.log") do (
    set "Line=%%I"
    if "!Line:~0,9!" == "Beginning" (
        set "PrintLines="
    ) else (
        if not "!Line:failed=!" == "!Line!" set "PrintLines=1"
    )
    if defined PrintLines echo %%I
)

endlocal
与第二种解决方案相比,该批处理代码将行开头区分大小写的开头解释为新段落,而不是空行。因此,的命令可以直接处理文件,而忽略空行

但这种解决方案也有两个问题:

以分号开头的行被FOR as忽略;是选项eol未显式设置为其他字符的默认值。这个问题可以通过使用一个字符指定eol=来解决,该字符绝对不存在于日志文件中的行首。 包含一个或多个感叹号的行输出不正确,因为在用文件中的行替换%%I后,在命令行set line=%%I上应用了启用的延迟环境变量扩展。 此解决方案期望以开头的行中的任何位置都不包含单词failed

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

回声/? endlocal/? findstr/? 对于/? 转到/? 如果/? 集/? setlocal/?
查找失败的文件.log?我必须创建一个批处理文件来查找它,并打印包含“失败”一词的行和包含消息“失败”的下一行error@CienzoJoshua,突出显示/选择文件内容,然后按{}按钮。完成bye@Mofi您确定两个故障之间的换行符吗。那ANS0238E呢?对我来说似乎只有一句话。