grep 模式 "variable=value" 并仅返回值 > 阈值的匹配条目

grep for a pattern "variable=value" and returning only matching entries having a value > threshold

我正在使用以下命令在 kubernetes pod 日志中搜索模式“variable=value”(例如,variable=10 或 variable=500):

Kubectl logs -f | grep “variable=”

我的问题是是否可以修改上面的命令以便 return 变量值大于某个阈值的日志,例如 threshold=300variable=301, variable=302 会被过滤掉,但是 variable=299 会被过滤掉

我知道我可以为此开发一个小程序,但我希望直接在命令行中快速解决,而无需编写小程序。

作为测试,我创建了这个文件:

Prompt> cat test.txt
var=2
var=22
var=222
blabla

首先,我过滤变量赋值行:

Prompt> grep "var=" test.txt
var=2
var=22
var=222

然后,我以两种方式根据值的条件进行过滤:

Prompt> grep "var=" test.txt | awk -F '=' '{if ( > 25) print  "=" }'
var=222

Prompt> grep "var=" test.txt | awk -F '=' '{if ( < 25) print  "=" }'
var=2
var=22

这是一个灵活的解决方案,允许您指定您喜欢的参数,并且功能相同:

< test_filter_threshold.txt | 

mawk 'NF*=(____=="<")!=((___~"."?+___:___\
          )<=+$(NF*=(!_<NF)*(__==$!_)))'  FS== OFS== \
                                          __="var" ___="1" ____=">="

var=2
var=22
var=222

___=4    ____='<'
var=2

___=200  ____='<'
var=2
var=22

___=200  ____='>='
var=222

___=200  ____=           # "<" is strictly less than, 
                         # all else def. to ">="
var=222

___='3.14159' ____='>='  # float point thresholds (TRHD) are valid 
var=22
var=222

___=   ____=             # missing TRHD def. to all
var=2
var=22
var=222

___='abc' ____='>='     # invalid TRHD def. to non-zero positive 
var=2
var=222
      1 var=2
      2 var=-22
      3 var=222
      4 blabla

我会使用 perl,这里我从名为 bash-pod 的 pod 中打印日志。过滤,只出现 threshold=<integer-greater-than-80> 的行。

kubectl logs -f bash-pod  |perl -ne '/.*threshold=(\d+).*/m;print if > 80'

以上代码使用以下 pod 进行测试:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: bash-pod
  name: bash-pod
spec:
  containers:
  - image: bash
    name: bash-pod
    resources: {}
    command: ['bash','-c','while true;do echo "threshold=$(( ( RANDOM % 100 )  + 1 ))";sleep 1;done']
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

输出:

kubectl logs -f bash-pod  |perl -ne '/.*threshold=(\d+).*/m;print if > 80'
threshold=82
threshold=90
threshold=89
threshold=90
threshold=85
threshold=83
threshold=86
threshold=83
...
.....

注意:如果你想考虑浮动,那么你可以使用 .*threshold=(\d+(?:\.\d+)?).* 作为新的正则表达式。

您没有提供任何样本输入,所以这是一个猜测,但这可能是您想要做的:

awk -F'=' '(=="variable") && (>300)' file

如果这不是您需要的全部,那么请 edit your question to include a Minimal, Reproducible Example 提供简明、可测试的示例输入、预期输出以及您尝试自己解决问题的尝试,以便我们进一步帮助您。请参阅 [提问] 并查看已投票并回答示例的现有问题。