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=300
、variable=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 提供简明、可测试的示例输入、预期输出以及您尝试自己解决问题的尝试,以便我们进一步帮助您。请参阅 [提问] 并查看已投票并回答示例的现有问题。
我正在使用以下命令在 kubernetes pod 日志中搜索模式“variable=value”(例如,variable=10 或 variable=500):
Kubectl logs -f | grep “variable=”
我的问题是是否可以修改上面的命令以便 return 变量值大于某个阈值的日志,例如 threshold=300
、variable=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 提供简明、可测试的示例输入、预期输出以及您尝试自己解决问题的尝试,以便我们进一步帮助您。请参阅 [提问] 并查看已投票并回答示例的现有问题。