MST

星途 面试题库

面试题:Bash中cut命令在动态文本处理场景下的优化应用

在一个实时更新的系统监控日志文件`monitor.log`中,内容格式为'时间戳 进程ID 进程状态 CPU使用率 内存使用率',如'1697030400 1234 running 50% 30%'。现在要求编写一个Bash脚本,使用`cut`命令以及其他合适命令,实时监控内存使用率超过80%的进程,当检测到这样的进程时,将其进程ID、时间戳和内存使用率记录到`high_mem_usage.log`文件中,并给出脚本优化思路以减少资源消耗。
31.0万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/bin/bash

while true; do
    grep -oE '[0-9]+\s+[0-9]+\s+\S+\s+[0-9]+%\s+([89][0-9]%|100%)' monitor.log | \
    cut -d ' ' -f 2,1,5 >> high_mem_usage.log
    sleep 1
done

脚本优化思路

  1. 减少文件I/O操作:目前脚本每次检测到符合条件的进程就追加写入文件,可考虑先在内存中缓存符合条件的数据,比如使用数组。当缓存达到一定数量(例如100条)或者经过一段时间(例如10秒),再批量写入文件。这样可以减少文件I/O的频率,降低系统资源消耗。
  2. 优化grep命令grep命令目前是在整个日志文件中搜索,若日志文件很大,效率较低。可以结合tail -f命令只监控日志文件新增的内容,这样可以避免重复搜索已经处理过的日志行。例如:tail -f monitor.log | grep -oE '[0-9]+\s+[0-9]+\s+\S+\s+[0-9]+%\s+([89][0-9]%|100%)'
  3. 减少不必要的命令执行cut命令每次执行也会消耗一定资源,可以在grep的正则表达式匹配时,直接提取需要的字段,避免使用cut。例如:grep -oE '([0-9]+\s+[0-9]+\s+\S+\s+[0-9]+%\s+([89][0-9]%|100%))' monitor.log,然后对匹配到的内容进行适当处理获取对应字段。