отправлять почту, когда файловая система достигает заданного порогового значения [closed]

Versión corta, usa esto:

$ echo "name@server.com" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'

Asumiendo que el mensaje de error real es algo como:

awk: cmd. line:1: error: Invalid range end: …

Entonces, hay 4 problemas en su línea:

  1. El guión(-)significa "rango de caracteres", no un guión explícito.

    El motivo del mensaje de error es que los dos caracteres que rodean el guión(-)dentro del rango de caracteres(_y.)no están en orden (ASCII ). El rango de caracteres .-_no genera ningún error. Pero estoy seguro de que no quiere decir "rango de caracteres" (todos los caracteres entre un punto .y un guión bajo _), sino hacer coincidir un guión explícito(-).

    Para hacer coincidir un guión explícito dentro de una "expresión de paréntesis", debe convertirlo en el primer o último carácter del rango. Ya sea [-…], […-]. O, desalentado, escapar de ella \-. Es decir, ambos funcionan:

    [-a-zA-Z0-9_.+]
     [a-zA-Z0-9_.+-]
    

    Pero no, una barra invertida no es una solución general para hacer explícito un guión. Prueba:

    $ echo 'ab-cd' | grep -Eo '[a\-c]+'
    ab
    c
    

    La expresión regular grep (incluso si se extiende:-E)no coincide con el guión.

  2. El +no es especial dentro de una "expresión entre corchetes", por lo tanto, no necesita escape (y escapar dentro de "expresiones entre corchetes" es un mal hábito ). Usa esto:

    ^([-a-zA-Z0-9_.+]+)@
    
  3. Un punto .es un carácter especial que "coincide con cualquier carácter excepto el de nueva línea".
    Como tal, debe escapar \.o usar una "expresión de paréntesis" [.]para hacer coincidir explícitamente un carácter de punto, use esto:

    ^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
    
  4. Y, finalmente, la "expresión de intervalo" es una extensión sobre las implementaciones históricas de awk, es posible que no funcione en todos los awk. Esto generalmente "no es un problema", pero si lo es, deberá usar:

    ([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$
    

Pero probablemente esté usando GNU awk,y la sintaxis correcta debería ser:

$ echo "name@server.com" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'
-2
04.03.2019, 09:29
1 ответ

Просто предложение, как вы могли бы это сделать. Смотрите комментарии в сценарии.

#!/bin/bash

# define constants on top so you can find and edit them easily
declare -ri threshold=1
declare -r mailsubject="[$(hostname)] FS Alert Exceed ${threshold}%"
declare -r mailbodystart="$(hostname) Filesystem Alert, threshold=${threshold}%\n"
declare -r mailto="abc@.com"

# use variable instead of output file
declare mailbody=""

for fs in $(df -hk | awk '{print $6}' | sed '1d'); do
        chk=$(df -hk ${fs} | sed '1d' | awk '{print $5}' | awk -F\% '{print $1}')
        if [ "$chk" -gt "$threshold" ]; then
                # append to mailbody
                mailbody="${mailbody}${chk}% ${fs}\n"
        fi
done

# send mail if mailbody is non-empty
if [ -n "$mailbody" ]; then
        # sort by filesystem size, largest first
        mailbody=$(echo -e "$mailbody" | sort -nr)
        echo -e "${mailbodystart}${mailbody}" | mailx -s "$mailsubject" "$mailto"
fi
0
28.04.2021, 23:36

Теги

Похожие вопросы