shell Linux中grep命令中的查找计数

hs1rzwqc  于 2022-11-25  发布在  Shell
关注(0)|答案(2)|浏览(213)

我有一个mongodb的日志文件。我想显示grep命令的所有输出大于或小于给定值“protocol:op_msg 523ms”

sed -n '/2022-09-15T12:26/,/2022-09-15T14:03/p' mongod.log| grep "op_msg 523ms"

日志文件输出:

7391:2022-11-22T09:23:23.047-0500 I  COMMAND  [conn26] command test.test appName: "MongoDB Shell" command: find { find: "test", filter: { creationDate: new Date(1663252936409) }, lsid: { id: UUID("7c1bb40c-5e99-4281-9351-893e3d23261d") }, $clusterTime: { clusterTime: Timestamp(1669126970, 1), signature: { hash: BinData(0, B141BFD0978167F8C023DFB4AB32BBB117B3CD80), keyId: 7136078726260850692 } }, $db: "test" } planSummary: COLLSCAN keysExamined:0 docsExamined:337738 cursorExhausted:1 numYields:2640 nreturned:1 queryHash:6F9DC23E planCacheKey:6F9DC23E reslen:304 locks:{ ReplicationStateTransition: { acquireCount: { w: 2641 } }, Global: { acquireCount: { r: 2641 } }, Database: { acquireCount: { r: 2641 } }, Collection: { acquireCount: { r: 2641 } }, Mutex: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 28615999, timeReadingMicros: 288402 } } protocol:op_msg 523ms

我已经尝试了下面的命令,但这个命令只给出确切的值。我需要找到所有大于100ms的日志文件查询。

sed -n '/2022-09-15T12:26/,/2022-09-15T14:03/p' mongod.log| grep "op_msg 523ms"
dgtucam1

dgtucam11#

**选项1)**您可以像这样使用grep bash onliner来过滤特定执行时间范围内的mongo查询:

grep -P '\d+ms' /log/mongodb/mongos.log  | while read LINE; do querytime="$(echo "$LINE" | grep -oP '\d+ms' | grep -oP '\d+')"; if [ "$querytime" -gt 6000 ]&&[ "$querytime" -lt 7000 ]; then echo "$LINE"; fi; done

解释道:
1.筛选结尾为Number+“ms”的所有日志行。
1.循环查询以提取querytime变量中的执行时间
1.检查$querytime是否介于6000毫秒和7000毫秒之间
1.如果$queritime在指定的范围内打印当前的$LINE

**选项2)**您可以使用mtools软件包中mlogfilter的--slow MS、--fast MS选项,在该软件包中,您可以执行以下操作:

mlogfilter mongod.log --slow 7000 --fast 6000
w1e3prcc

w1e3prcc2#

如果所有感兴趣的行都将protocol:op_msg作为倒数第二列,那么这就变得非常简单了:

awk '$(NF-1) ~ /protocol:op_msg/ && $NF > 100 { print $NF }'

请注意,这在进行比较时完全忽略了单位,并且还会打印最后一列为250h250ns的行,但这很容易过滤。有了更准确的问题描述,肯定会有更准确的解决方案。

相关问题