使用AWK过滤Linux输出

wko9yo5t  于 2022-12-03  发布在  Linux
关注(0)|答案(2)|浏览(139)

我试图过滤掉一个文件的内容,但有些原因它不工作。我的目标是过滤掉任何以“build-”开头的内容,它的年龄是1天以上。有时它显示分钟/小时/天,因此我需要过滤1d,24 h,1440 m和以上。(X〉= 1d|| X〉= 24小时||X〉= 1440米)。
这是我的文本文件:

NAME              STATUS   AGE
argocd            Active   10d
build-start-a     Active   1d
build-start-b     Active   22h
build-start-s     Active   145m
default           Active   12d
games             Active   9d
kube-node-lease   Active   12d
kube-public       Active   12d
kube-system       Active   12d
start-build-s     Active   96m

这是我的命令:

cat test.txt | grep "^build-*" | awk '{ if ($3 >= 1d || $3 >= 24h || $3 >= 1440m) print $1 }'

结果为:
建立-启动-a
构建启动b
建置开始
(而不仅仅是“build-start-a”,因为它是唯一一个符合我希望的条件的。)
我的猜测是bash比较“22 h”+“145 m”和“1d”,并假设“22 h”+“145 m”大于“1d”,这就是为什么我看到三行。我尝试了多种不同的if条件,但它不适合我。尝试“硬编码”值,并将“1d”“24 h”,它也不工作。尝试使用else if实现它,但结果是相同的。
我很感激你能理解我做错了什么,并得到你的帮助!
谢谢你:)

8yparm6h

8yparm6h1#

您可以使用此awk解决方案:

awk '
/^build-/ &&
(  (/d$/ && $3+0 >= 1) ||
   (/h$/ && $3+0 >= 24) ||
   (/m$/ && $3+0 >= 1440) )' file

build-start-a     Active   1d

如您所见,我们根据$3中的最后一个字符应用了不同的条件。$3+0将第3列转换为数值。

ulydmbyx

ulydmbyx2#

只需将每个时间转换为分钟,然后按分钟计算:

$ cat tst.awk
{ mult = 1 }
/h$/ { mult = 60 }
/d$/ { mult = 24 * 60 }
/^build-/ && ($3*mult >= 1440)
$ awk -f tst.awk test.txt
build-start-a     Active   1d

相关问题