【问题标题】:Read data from file (as arrays) lines and do a comparison从文件(作为数组)行中读取数据并进行比较
【发布时间】:2020-10-17 15:05:49
【问题描述】:

我有一个问题,不知道哪个解决方案更好用,我会先描述我的需求以便向您解释:

我有一个文本文件,标题为服务器名称,例如:server1.txt

在这个文件中我有类似数组的东西(基本上是检查结果):

cciex6:~/folder$
cciex6:~/folder$ cat server1
8 16 UP 10-6-2020-16:04
8 16 UP 15-6-2020-16:04
8 16 UP 20-6-2020-16:04
6 16 UP 25-6-2020-16:04
cciex6:~/folder$

8 : 表示 8 个核心

16 : 表示 16 Gb 内存

UP : 表示 ping 成功,服务器已启动

20-1-2020-16:04 :检查和创建结果的日期。


我在 servers.txt 中有一些服务器 IP

2 个脚本:

第一个脚本,将对 servers.txt 中的每个服务器进行检查,(检查 cpu 内核、内存、启动或关闭以及检查日期)将此信息存储在 server1 文件中

第二个脚本 应该从 server1 文件中读取行,如果结果相同,则在新结果(server1 文件中的最后一行)和旧结果(最后一行之前的行)之间进行一些比较无事可做,万一内存增加或服务器关闭,应该在日志文件或控制台或其他东西中给我警报。

对于第一个脚本,它已经完成,我可以运行它并从服务器列表中获取我需要的信息

我的问题是第二个脚本,我如何从 server1 文件中读取 RAM + CPU + UP 或 DOWN 状态,并将最后一个结果与上一个结果之前的结果进行比较,

任何想法请或帮助

真的很感激

【问题讨论】:

    标签: arrays bash shell git-bash


    【解决方案1】:

    获取文件的最后两行,然后比较它们,类似于。

    #!/usr/bin/env bash
    
    file=server1.txt
    declare -A old_result new_result
    mapfile -t results < <(tail -n2 "$file")
    
    read -r old_core old_ram old_status old_date <<< "${results[0]}"
    read -r new_core new_ram new_status new_date <<< "${results[1]}"
    
    old_result=(
      [core]="$old_core"
      [ram]="$old_ram"
      [status]="$old_status"
      [date]="$old_date"
    )
    
    new_result=(
      [core]="$new_core"
      [ram]="$new_ram"
      [status]="$new_status"
      [date]="$new_date"
    )
    
    for item in "${!old_result[@]}"; do
      [[ $item == date ]] && continue
      if [[ ${old_result[$item]} != ${new_result[$item]} ]]; then
        printf >&2 'old %s and new %s does not match!\n' "$item ${old_result[$item]}" "$item ${new_result[$item]}"
      fi
    done
    
    • 它需要 bash4+ 因为 mapfile 和可能的关联数组。

    • 它会跳过日期,但如果您需要比较日期,只需注释掉日期比较或删除该行。


    只使用没有mapfile的关联数组。

    #!/usr/bin/env bash
    
    file=server1.txt
    declare -A old_result new_result
    
    {
      read -r old_core old_ram old_status old_date
    
      old_result=(
        [core]="$old_core"
        [ram]="$old_ram"
        [status]="$old_status"
        [date]="$old_date"
      )
    
      read -r new_core new_ram new_status new_date
    
      new_result=(
        [core]="$new_core"
        [ram]="$new_ram"
        [status]="$new_status"
        [date]="$new_date"
      )
    
    } < <(tail -n2 "$file")
    
    for item in "${!old_result[@]}"; do
      [[ $item == date ]] && continue
      if [[ ${old_result[$item]} != ${new_result[$item]} ]]; then
        printf >&2 'old %s and new %s does not match!\n' "$item ${old_result[$item]}" "$item ${new_result[$item]}"
      fi
    done
    

    没有mapfile 和关联数组,只使用while 读取循环。

    #!/usr/bin/env bash
    
    file=server1.txt
    
    while read -r old_core old_ram old_status old_date; do
      read -r new_core new_ram new_status new_date
      if [[ $old_core != $new_core ]]; then
        printf >&2 'old core %s and new core %s does not match!\n' "$old_core" "$new_core"
      fi
      if [[ $old_ram != $new_ram ]]; then
        printf >&2 'old ram %s and new ram %s does not match!\n' "$old_ram" "$new_ram"
      fi
      if [[ $old_status != $new_status ]]; then
        printf >&2 'old status %s and new status %s does not match!\n' "$old_status" "$new_status"
      fi
    done < <(tail -n2 "$file")
    

    应该在日志文件或控制台或其他东西中给我警报。

    将脚本传送到wall,即使通过cron 调用它也应该可以工作,它还有一些可供您使用的选项。

    【讨论】:

      【解决方案2】:

      似乎您需要做的就是比较最后两行。这是一个执行此操作的 awk 脚本:

      awk ' { 
        line_prev = line_last ; 
        $4 = ""
        line_last = $0 
      }
      END {
        if (line_prev && line_prev != line_last || line_last ~ /DOWN/ ) { 
          print "Alert!", FILENAME, line_prev, "--->",  line_last
        }
      }' "$1"
      

      脚本,我们称之为./second_script,可以这样调用:

      ./second_script server1
      

      您可以将输出通过管道传输到 syslog,以便接收警报。

      ./second_script server1 | logger "<add-your-favorite-syslog-parameters here>"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多