bash вложенные операторы if внутри оператора while - PullRequest
1 голос
/ 16 июня 2020

Кажется, что в моем файле снова и снова выписывается переменная linefix после оценки кода sed Status:

есть какие-нибудь идеи о том, что я сделал не так с вложением? Или это переменная "prior", которая устанавливается до while, а затем используется во вложенном операторе if? Установив для него строку Null, поскольку изначально у нас нет предыдущей строки, затем каждый раз, когда он находит дату, я выписываю предыдущую строку в надежде, что, когда я не найду дату в строке, я могу добавить ее в строку со значением статуса.

код: '' '

input="/var/log/alertError.log"
prior="NULL"
while IFS= read -r line ; do
        if [[ $line =~ [0-9]{2}/[0-9]{2}/[0-9]{2} ]]; then
                echo "$line" >> /var/log/alertErrorFinal.log
                prior=$line
        else
                if [[ "$line" =~ 'Status:' ]]; then
                        linefix=$(sed -n -e 's/^.*\(Status: \)/\1/p')
                        priordate=$(echo "$prior" | awk -F'[][]' '{print $2}')
                        echo "$priordate    $linefix" >> /var/log/alertErrorFinal.log
                else
                        echo "$line" >> /var/log/alertErrorFinal.log
                fi
        fi
done < $input

' ''

Вывод:

'' '

jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:Filtering out notification-only attributes.
jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:Pumping XDS to ldap.
jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:Performing operation status for .
jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:
jcl/jclnt.log-DirXML Log Event -------------------
jcl/jclnt.log-     Driver:   \StarWars\system\Driver Set\AD-wookie
jcl/jclnt.log-     Channel:  Publisher
05/05/20 02:20:15.669    Status:   Error
Status:   Error
Status:   Error
Status:   Error
Status:   Error

'' '

Ввод:' ''

jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:Filtering out notification-only attributes.
jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:Pumping XDS to ldap.
jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:Performing operation status for .
jcl/jclnt.log-[05/05/20 02:20:15.669]:jclnt PT:
jcl/jclnt.log-DirXML Log Event -------------------
jcl/jclnt.log-     Driver:   \StarWars\system\Driver Set\AD-wookie
jcl/jclnt.log-     Channel:  Publisher
jcl/jclnt.log-     Status:   Error

'' '

1 Ответ

1 голос
/ 16 июня 2020

Похоже, что ваша команда sed не имеет входных данных - это означает, что она захватит весь оставшийся вывод, исходящий из < $input, что заставит его использовать все оставшиеся строки сразу.

Кажется, вы хотели это сделать:

linefix=$(echo "$line" | sed -n -e 's/^.*\(Status: \)/\1/p')

Или, если вы хотите быть более интересным и сэкономить на эхо и канале, вы можете использовать здесь строку:

linefix=$(sed -n -e 's/^.*\(Status: \)/\1/p' <<< "$line")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...