脚本用于在文件中查找模式并对提取的字符串执行算术运算

脚本用于在文件中查找模式并对提取的字符串执行算术运算

我是脚本编写的新手,因此正在寻找一些关于如何解决我的问题的指点。

有一个日志文件(server.log)用于跟踪与数据库的连接数。

模式为 grep “错误编号 1**(该编号介于 1 和 30000 之间)** 在块之前可能出现 30000 个错误”

我需要做的是对数字执行算术运算,需要差值,所以在上面的例子中 30000-1 =29999。根据结果,我需要打印警告或严重消息。

如果差异小于 10,000,则会产生警告;如果差异大于 10,000,则会产生严重后果。

谢谢,K

答案1

也许这会有所帮助:

我的假设:您有一个文件,其中的行包含 1-30000 范围内的数字,假设有 1-10000 个数字,则没问题,10 - 20 000 个数字是警告,20 - 30 000 个数字是关键。您不需要算术运算来匹配数字大小,您可以使用正则表达式:

例如:

$ grep -E '2[0-9]{4}' file >/dev/null && echo "Critical"
$ grep -E '1[0-9]{4}' file >/dev/null && echo "Warning"

第一行匹配 20000 - 29999 并打印“Critical”,匹配 10 000 - 19 999 则输出“Warning”。0 - 9 999 不输出任何内容,但是可以输出,如下所示:

#!/bin/bash

more_than_2k=$(grep -E '2[0-9]{4}' file)

if [ "$?" -eq "0" ] ; then
  echo "Critical"
else
  more_than_1k=$(grep -E '1[0-9]{4}')
  if [ "$?" -eq "0" ]; then
    echo "Warning"
  else
    echo "Nothing happens"
  fi
fi

或者您可以准确地指定它(请注意,5 位数字包含 4 位或更少的数字,所以您无法说,grep -E '[0-9]{1,4}' file但您可以指定一个周围环境(对于日志来说这应该很容易)。

或者你可以使用 awk:

$ cat file
9000
900
900
900
800
18000
1900

$ awk '{ if ($1 > 8000 &&  $1 < 10000)
  print "warn"
  else if ($1 > 10000)
  print "crit" }' file

warn
crit

编辑:

您可以向 grep 添加前缀和后缀:

$ cat file 
error number 9000 on 30000 possible block
error number 900 on 30000 possible block
error number 900 on 30000 possible block
error number 900 on 30000 possible block
error number 800 on 30000 possible block
error number 18000 on 30000 possible block
error number 1900 on 30000 possible block

$ grep -E 'error number 1[0-9]{4} on 30000 possible block' file
error number 18000 on 30000 possible block

$ awk '{ if ($3 > 8000 &&  $3 < 10000)
  print "warn"
  else if ($3 > 10000)
  print "crit" }' file
warn
crit

相关内容