我有一个包含数百万行日志的大文本文件。
我想过滤所有满足以下条件的行
- url 应该是
url=/v2/testB
- totalTime 值应大于 500
INFO|id=1|totaltime=5000|httpmethod=POST|url=/v1/testA
INFO|id=2|totaltime=200|httpmethod=POST|url=/v2/testB
INFO|id=3|totaltime=1000|httpmethod=POST|url=/v2/testB
INFO|id=4|totaltime=501|httpmethod=POST|url=/v2/testB
结果:-
id=3,totaltime=1000
id=4,totaltime=501
我试过用多个awk,然后放if block,不知道能不能很快搞定?谢谢!
while IFS= read -r line; do
value=`echo $line|grep "url=/v2/testB" | awk -F"totaltime=" '{ print $2}'| awk -F"|" '{ print $1}'`
if (( $value > 500 )); then
echo $line
fi
done < file.log
最佳答案
你可以使用这个 awk:
awk -F '|' -v OFS=, '$NF == "url=/v2/testB" {v=$3; sub(/^totaltime=/, "", v); if (v+0 > 500) print $2, $3}' file
id=3,totaltime=1000
id=4,totaltime=501
为了使其更具可读性:
awk -F '|' -v OFS=, '
$NF == "url=/v2/testB" {
v = $3
sub(/^totaltime=/, "", v)
if (v+0 > 500)
print $2, $3
}' file
如果你有 gnu-awk
那么它可以简化为:
awk -F '|' -v OFS=, '$NF == "url=/v2/testB" &&
gensub(/^totaltime=/, "", "1", $3)+0 > 500 {print $2, $3}' file
v+0
是 awk 中的简写,用于将字符串值转换为数字。
关于bash - 根据特定字符串过滤行,然后只打印一些更大的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70895765/