MST

星途 面试题库

面试题:Bash文本处理与系统集成优化

你需要处理一个实时日志文件,日志文件每秒会新增若干行记录。日志格式为'时间戳 事件类型 详细信息'。你要编写一个Bash脚本,实时监控该日志文件,统计不同事件类型每分钟出现的次数,并将统计结果实时发送到一个远程服务器的特定接口(假设接口接受JSON格式数据)。在处理过程中,要保证脚本高效运行,不影响系统性能。请阐述实现的整体架构、关键技术点,并给出核心代码片段。
34.0万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

整体架构

  1. 实时读取日志:使用 tail -f 命令实时读取日志文件新增内容。
  2. 数据处理:对读取到的每一行日志按空格进行分割,提取事件类型。
  3. 统计计数:使用关联数组(Bash 4.0+)来统计不同事件类型在每分钟内出现的次数。
  4. 定时发送:使用 sleep 配合循环实现每分钟定时将统计结果发送到远程服务器接口。

关键技术点

  1. 实时读取日志tail -f 命令能实时追踪文件新增内容,保证日志数据的实时获取。
  2. 关联数组:Bash 4.0 引入的关联数组方便按事件类型作为键进行计数统计。
  3. JSON 格式化:使用工具如 jq(需安装)或自行拼接 JSON 格式字符串,将统计结果格式化为符合远程接口要求的 JSON 数据。
  4. 网络请求:使用 curl 命令将 JSON 数据发送到远程服务器接口。

核心代码片段

#!/bin/bash

# 确保Bash版本支持关联数组(Bash 4.0+)
if ((BASH_VERSINFO[0] < 4)); then
    echo "This script requires Bash 4.0 or higher"
    exit 1
fi

# 日志文件路径
log_file="your_log_file.log"
# 远程服务器接口
api_url="http://your_remote_server/api"

# 初始化关联数组
declare -A event_count
while true; do
    # 实时读取日志文件新增行
    while IFS=' ' read -r timestamp event_type details; do
        # 统计事件类型出现次数
        ((event_count[$event_type]++))
    done < <(tail -n +1 -f $log_file | sed '1!G;h;$!d')

    # 等待1分钟
    sleep 60

    # 构建JSON数据
    json_data='{"event_counts": {'
    first=true
    for event in "${!event_count[@]}"; do
        if $first; then
            first=false
        else
            json_data+=","
        fi
        json_data+="\"$event\": ${event_count[$event]}"
    done
    json_data+="}}"

    # 发送数据到远程服务器
    curl -X POST -H "Content-Type: application/json" -d "$json_data" $api_url

    # 重置关联数组
    unset event_count
    declare -A event_count
done