我试图从文件中筛选出内容,但有些-为什么它不起作用. 我的目标是过滤掉任何以"Build-"开头的东西,它的年龄在1天以上. 有时它显示分钟/小时/天,因此我需要过滤1D、24小时、1440米和更高. (X&>;=1D||X&>;=24小时||X&>;=1440M).

这是我的文本文件:

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 }'

结果是:

build-start-a
build-start-b
build-start-s

(而不仅仅是"构建-启动-a",因为它是唯一符合我希望的条件的.)

我的猜测是,bash比较了"22h"+"145m"和"1D",并假设"22h"+"145m"大于"1D",这就是为什么我看到三条线. 我try 了多种不同的If条件,但对我都不起作用. 我试图对这些值进行"硬编码",把"1D"写成"24小时",但效果不佳. try 使用Else If实现它,但结果是相同的.

如果能理解我做错了什么,并得到你的帮助,我将不胜感激!

谢谢:)

推荐答案

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

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

build-start-a     Active   1d

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

Linux相关问答推荐

我想强调某些条件是否与Linux中的全部输出匹配

C++17:G++8.5版似乎无法正确生成无符号64位伪随机整数

如何更正我的CMakeLists.txt,使我的项目同时构建在Linux和Windows上?

Linux 'column' 实用程序的使用

Linux PREEMPT_RT:SCHED_OTHER 的性能优于 SCHED_FIFO.为什么?

在 Ubuntu 中,如何设置 Tomcat 9 以使用 Java 17?

将特定列转换为行

我可以防止 gcc 优化器延迟内存分配吗?

Linux 系统调用文档

Bash - 如何根据 names.txt 重命名目录中的文件

获取变量中的当前路径并使用它

如何/在哪里可以找到要修复的 Linux 内核错误?

在 Bash 中从最后到第一个输出文件行

如何在 Linux 中创建高分辨率计时器来测量程序性能?

Linux AMD64 中如何使用 fs/gs 寄存器?

如何等待第一个命令完成?

基于shell中正则表达式的 colored颜色 突出显示输出

如何在 linux 中使用 CMake 和 Kdevelop 编译 GLUT + OpenGL 项目?

我可以使用 awk 将所有小写字母转换为大写吗?

当我已经 ssh 进入远程机器时,如何 scp 回到本地?