首页 > 解决方案 > 使用 grep 或 ack 可靠地检查 wget 日志中的错误

问题描述

在一个 bash 文件中,我有logfileA.txt一个包含wget我想运行grep的输出,以检查“错误”或“失败”等单词的任何实例,如下所示:

grep -ni --color=never -e "error" -e "fail" logfileA.txt | awk -F: '{print "Line "$1": "$2}'
# grep -n line number, -i ignore case; awk to add better format to the line numbers (https://stackoverflow.com/questions/3968103)

麻烦的是,我认为wget输出中logfileA.txt充满了可能会混淆输入的字符grep,因为我没有得到可靠的匹配。

对此进行故障排除,我什至无法cat可靠地获取日志文件的内容。例如,使用cat logfileA.txt,我得到的只是最后一行乱码:

FINISHED --2019-05-29 17:08:52--me@here:/home/n$ 71913592/3871913592]atmed out). Retrying.

的内容logfileA.txt是:

--2019-05-29 15:26:50--  http://somesite.com/somepath/a0_FooBar/BarFile.dat
Reusing existing connection to somesite.com:80.
HTTP request sent, awaiting response... 302 Found
Location: http://cdn.somesite.com/storage/a0_FooBar/BarFile.dat [following]
--2019-05-29 15:26:50--  http://cdn.somesite.com/storage/a0_FooBar/BarFile.dat
Resolving cdn.somesite.com (cdn.somesite.com)... xxx.xxx.xx.xx
Connecting to cdn.somesite.com (cdn.somesite.com)|xxx.xxx.xx.xx|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3871913592 (3.6G) [application/octet-stream]
Saving to: 'a0_FooBar/BarFile.dat’

a0_FooBar/BarFile.dat   0%[                    ]       0  --.-KB/s               
a0_FooBar/BarFile.dat   0%[                    ]  15.47K  70.5KB/s               
...
a0_FooBar/BarFile.dat  49%[========>           ]   1.80G  --.-KB/s    in 50m 32s 

2019-05-29 16:17:23 (622 KB/s) - Read error at byte 1931163840/3871913592 (Connection timed out). Retrying.

--2019-05-29 16:17:24--  (try: 2)  http://cdn.somesite.com/storage/a0_FooBar/BarFile.dat
Connecting to cdn.somesite.com (cdn.somesite.com)|xxx.xxx.xx.xx|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 3871913592 (3.6G), 1940749752 (1.8G) remaining [application/octet-stream]
Saving to: 'a0_FooBar/BarFile.dat’

a0_FooBar/BarFile.dat  49%[+++++++++           ]   1.80G  --.-KB/s               
...
a0_FooBar/BarFile.dat 100%[+++++++++==========>]   3.61G  1.09MB/s    in 34m 44s 

2019-05-29 16:52:09 (909 KB/s) - 'a0_FooBar/BarFile.dat’ saved [3871913592/3871913592]

FINISHED --2019-05-29 17:08:52--

我假设问题可能是/s 或---s 或>s 或==>s 或|s?

但由于输出wget可能会有所不同,我如何预测和逃避任何有问题的事情grep

命令:

grep -ni --color=never -e "error" -e "fail" logfileA.txt | awk -F: '{print "Line "$1": "$2}'

预期输出:

Line 17: 2019-05-29 16:17:23 (622 KB/s) - Read error at byte 1931163840/3871913592 (Connection timed out). Retrying.

另外,这ack条线会更适合这项工作吗?如果是这样,什么/如何?

标签: bashawkgrepwgetack

解决方案


Wrt I assume the problem could be the /s or ---s or >s or ==>s or |s?- 不,这些字符/字符串中的任何一个都没有什么特别之处。听起来您可能有 DOS 行尾 ( \r\n),请参阅为什么我的工具输出会覆盖自身以及如何修复它?. 既然你说with cat logfileA.txt, all I get is the last line which is garbled我想知道你是否只有\rs 和没有\ns 作为行尾。如果你这样做,那么tr '\r' '\n' < logfileA.txt > tmp && mv tmp logfileA.txt会解决这个问题。如果这是问题所在,那么您可以使用awk -v RS='\r' 'script'将记录分隔符从默认值更改\n\r,然后您就不需要执行该tr步骤。

但是,当您使用 awk 时,您不需要 grep。这:

grep -ni --color=never -e "error" -e "fail" logfileA.txt |
    awk -F: '{print "Line "$1": "$2}'

可以写成:

awk 'tolower($0) ~ /error|fail/{print "Line "NR":"$0}' logfileA.txt

但是 awk-only 版本更健壮,因为它会正确显示包含:s 的完整行,其中 grep+awk 版本会将它们截断为第一个:.

您可以通过调整脚本来处理 DOS 行结尾(如果有):

awk 'tolower($0) ~ /error|fail/{sub(/\r$/,""); print "Line "NR":"$0}' logfileA.txt

并且您可以通过使用 GNU awk 执行此操作,使其作为独立单词(而不是像terroror之类的其他字符串的一部分)查找错误或失败:failles

awk -v IGNORECASE=1 -v RS='\r?\n' '/\<(error|fail)\>/{print "Line "NR":"$0}' logfileA.txt

或者这个与任何awk:

awk 'tolower($0) ~ /(^|[^[:alnum:]_])(error|fail)([^[:alnum:]_]|$)/{sub(/\r$/,""); print "Line "NR":"$0}' logfileA.txt

推荐阅读