Проверьте поля для каждой строки в файле журнала, используя awk - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь проверить файл в журнале, строка за строкой.Для каждой строки проверьте, является ли конкретное поле пустым или поле имеет неправильное значение.И выведите строку с сообщением об ошибке

#!/bin/bash
LOG=/log/output.log

x=false

    while read -r line; do


            if
              (echo $line | awk -F'|' '{if ($8=="") print "Application is empty"}') ||
              (echo $line | awk -F'|' '{if ($9=="") print "Http request method is empty"}') ||
              (echo $line | awk -F'|' '{if ($7=="") print "Operation is empty"}')
              (echo $line | awk -F'|' '{if ($13 !~ /0|1|2/) print "result(0,1,2) has a wrong value"}')

            then
                    echo $line
            fi

    done < "$LOG"

Фактические результаты:

9f2b | EDR | V1 | 0 | V1 | 2019-05-14 | 7 |||| 2019-05-14T08: 00: 40.095Z | 1 | 0 | 14 | 19 ||| XXXXX ||||||||| 897 ||||||||| 5b8689707 |||||||

Приложение пусто

9f2b | EDR | V1 | 0 | V1 | 2019-05-14 | 7 |||| 2019-05-14T08: 00: 40.095Z | 18 | 0 |||||XXXXX ||||||||| 1234 ||||||||| 5b868007 |||||||

Приложение пусто

42e2 | EDR | V1 | 0| V1 | 2019-05-14 | 7 |||| 2019-05-14T08: 00: 42.532Z | 22 | 0 ||||| XXXXX ||||||||| 235 ||||||||| 3b6959ae ||||||||

Приложение пустое

83ac | EDR | V1 | 0 | V1 | 2019-05-14 | 7 |||| 2019-05-14T08: 00: 42.758Z | 8 | 0 ||||| XXXXX ||||||||| 789 ||||||||| 5945548f |||||

ОжидаетсяРезультат:

Приложение пусто

Операция пуста

Метод запроса Http пуст

83ac | EDR | V1 | 0 | V1 | 2019-05-14 | 7 |||| 2019-05-14T08: 00: 42.758Z | 8 | 0 ||||| XXXXX ||||||||| 789 ||||||||| 5945548f |||||

1 Ответ

2 голосов
/ 14 мая 2019

awk читает каждую строку файла, поэтому вам не нужен цикл while с echo s.Просто выполните:

awk -F\| ' {b=1}
    $8=="" { print "Application is empty"; b=0 } 
    $9=="" { print "Http request method is empty"; b=0 }
    $7=="" { print "Operation is empty"; b=0 }
    $13 !~ /0|1|2/ {print "result(0,1,2) has a wrong value"; b=0 }
    b
' /log/output.log

Основная проблема вашего подхода состоит в том, что команда, которую вы оцениваете с помощью if, всегда выполняется успешно, поэтому вы всегда печатаете строку.Для сбоя awk вы должны добавить операторы выхода к каждому из операторов awk.(Например, echo $line | awk -F'|' '$8=="" {print "Application is empty"; exit 1 }'

. Это приведет к выводу нескольких сообщений об ошибках, если в строке не выполнено несколько условий, что не произойдет при добавлении операторов выхода и короткого замыкания операторов ||.

Если вы хотите напечатать только одно сообщение об ошибке, вы можете сделать:

awk -F\| '
    $8=="" { print "Application is empty"; next } 
    $9=="" { print "Http request method is empty"; next }
    $7=="" { print "Operation is empty"; next }
    $13 !~ /0|1|2/ {print "result(0,1,2) has a wrong value"; next }
' /log/output.log

Или, если вы хотите напечатать несколько сообщений об ошибках, но все в одной строке, вы можете сделать:

awk -F\| ' {s=""}
    $8=="" { printf "Application is empty"; s="; " } 
    $9=="" { printf "%sHttp request method is empty", s; s="; " }
    $7=="" { printf "%sOperation is empty", s; s="; " }
    $13 !~ /0|1|2/ {printf "%sresult(0,1,2) has a wrong value", s; s="; " }
    s { print ""}
    !s
' /log/output.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...