bash - 根据特定字符串过滤行,然后只打印一些更大的属性

标签 bash awk sh

我有一个包含数百万行日志的大文本文件。

我想过滤所有满足以下条件的行

  1. url 应该是 url=/v2/testB
  2. 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/

相关文章:

linux - 检查目录是否存在在 bash 中不会失败

linux - Grep:与 -e 和 -o 选项一起使用

bash - yq - 添加多行字符串

linux - 使用 for 循环设置变量

bash - awk:如果满足条件,将字符串添加到这些行

bash - 是否可以使用命令行确定 YARN 中当前事件的调度程序插件?

regex - 使用awk或sed将文件的特定区域输出到另一个文件?

bash - 打印除当前用户之外的所有用户终端

shell - 如何在 Makefile 中定义全局 shell 函数?

string - 如何检查字符串是否包含 Bash 中的子字符串