Bash:验证行内接近“0”的数字;“大”;日志文件

Bash:验证行内接近“0”的数字;“大”;日志文件,bash,variables,text,Bash,Variables,Text,我想做的是:制作一个bash脚本,在我的系统上执行一些测试,然后读取一些日志文件,最后给我一些分析 例如,我有一个日志文件(虽然有时它不是那么大,但我希望在可能的情况下保存进程),它的结尾是这样的: Ran 6 tests with 1 failures and 0 errors in 1.042 seconds. Tearing down left over layers: Tear down Products.PloneTestCase.layer.PloneSite in 0.463 se

我想做的是:制作一个bash脚本,在我的系统上执行一些测试,然后读取一些日志文件,最后给我一些分析

例如,我有一个日志文件(虽然有时它不是那么大,但我希望在可能的情况下保存进程),它的结尾是这样的:

Ran 6 tests with 1 failures and 0 errors in 1.042 seconds.
Tearing down left over layers:
Tear down Products.PloneTestCase.layer.PloneSite in 0.463 seconds.
Tear down Products.PloneTestCase.layer.ZCML in 0.008 seconds.
我已经有了这个bash行,它采用了我想要的行(有失败和错误的行):

Obs:如果“tac”将文件的每一行的进程传递给grep,或者首先将孔文件加载到内存中,然后grep在孔“内存变量”上运行,有人能回答我吗?因为我想把grep运行到每一行,当我想要的行出现时,我会停止“cating”过程
如果它确实是这样工作的(“grepping”每行),当grep找到它想要的东西时(使用-m1选项),它会停止tac进程吗?我该怎么做?
还有,你知道更好的方法吗

继续

因此,该命令的结果是:

Ran 6 tests with 1 failures and 0 errors in 1.042 seconds.
现在,我想检查$error_行变量上的“1”和“0”值是否都等于0(好像它们不在本例中),以便如果它们中的任何一个不同,我可以执行其他过程来分析是否发现了错误或失败

答案?

awk:

/^Ran / {
  print "No failures: " ($5 == 0)
  print "No errors: " ($8 == 0)
}
awk:


对于非常大的日志文件,最好先使用
grep
找到所需的模式,然后使用
awk
进行其他处理

   grep "^Ran" very_big_log_file | awk '{print $5$8=="00"?"no failure":"failure"}'
否则,只要awk就行了

awk '{print $5$8=="00"?"no failure":"failure"}'

对于非常大的日志文件,最好先使用
grep
找到所需的模式,然后使用
awk
进行其他处理

   grep "^Ran" very_big_log_file | awk '{print $5$8=="00"?"no failure":"failure"}'
否则,只要awk就行了

awk '{print $5$8=="00"?"no failure":"failure"}'

grep
因为找到模式而退出时,一个
SIGPIPE
被发送到
tac
使其退出,这样它就不会继续不必要地运行

read failures errors <<< $(tac $p.log | grep -Pom 1 '(?<= )[0-9]*(?= *(failures|errors))')
if [[ $failures == 0 && $errors == 0 ]]
then
    echo "success"
else
    echo "failure"
fi
或者,使用伊格纳西奥答案的变体:

read failures errors <<< $(tac $p.log | awk '/^Ran/ {printf "%s\n%s\n", $5, $8}'

readfailures errors当
grep
因为找到模式而退出时,一个
SIGPIPE
被发送到
tac
使其退出,这样它就不会继续不必要地运行

read failures errors <<< $(tac $p.log | grep -Pom 1 '(?<= )[0-9]*(?= *(failures|errors))')
if [[ $failures == 0 && $errors == 0 ]]
then
    echo "success"
else
    echo "failure"
fi
或者,使用伊格纳西奥答案的变体:

read failures errors <<< $(tac $p.log | awk '/^Ran/ {printf "%s\n%s\n", $5, $8}'

read failures errors我如何使用awk将$5变量分配给某个bash变量,以便我可以在bash脚本的其他部分使用此外部变量?例如,在这一行:tac nsi.metadataextractor.log | grep-m1'[1-9].*(失败)| awk'{…您的代码在这里分配变量…}'您的两个选项是打印出
$5
$8
,捕获bash变量中的输出,然后使用参数展开将它们分开,或者继续在awk中进一步处理。结束时为:failures=$(echo$error|message | awk'{print$5})errors=$(echo$error|message awk'{print$8})如何使用awk将$5变量分配给某个bash变量,以便在bash脚本的其他部分使用此外部变量?例如,在这一行:tac nsi.metadataextractor.log | grep-m1'[1-9].*(失败)| awk'{…您在此处分配变量的代码…}您的两个选项是打印出
$5
$8
,在bash变量中捕获输出,然后使用参数展开将它们分开,或者在awk中继续进一步处理。结束于:failures=$(echo$error_message | awk'{print$5}')errors=$(echo$error_message | awk'{print$8})这在我的系统上不起作用,因为只有在使用--enable perl regexp编译grep时才允许使用-P选项。你能告诉我一个没有-P选项的解决方案吗?因为你更接近我的答案。谢谢。对不起,这是最后一个问题。如果行在两种模式之间更改,即有时以“Ran”开头,有时以“Total:”开头,该怎么办。正则表达式会是什么样子?(如果这两种解决方案都没有太多问题的话?@Gabriel:对于AWK版本:
/^Ran | ^Total://
谢谢。使用:tac$p.log | grep-om 1'*\(Ran\;Total:\).*\(failures\'errors\)'| grep-om 1'[0-9]**\(failures\'errors\)'| cut-d'-f2这在我的系统上不起作用,因为只有在使用--enable perl regexp编译grep时才允许使用-p选项。你能告诉我一个没有-P选项的解决方案吗?因为你更接近我的答案。谢谢。对不起,这是最后一个问题。如果行在两种模式之间更改,即有时以“Ran”开头,有时以“Total:”开头,该怎么办。正则表达式会是什么样子?(如果这两种解决方案都没有太多问题的话?@Gabriel:对于AWK版本:
/^Ran | ^Total://
谢谢。使用以下方法解决:tac$p.log | grep-om 1'*\(Ran \;总计:\).*\(失败\错误\)''grep-om 1'[0-9]**\(失败\错误\)'.'cut-d'-f2