Замена внутреннего цикла следующим образом:
line=0
while read Date Time Username Viewer IP COMMENT
do
let line=1+$line
awk -F "$IFS" '
BEGIN {
IP="'${IP}'"
if(!match(IP, "^[0-9]+$")) {exit}
line='"${line}"'
}
NR<line { next }
NR==line {
print "CONNECT:",$0
next
}
$5==IP && $4 != "New" {
print "DISCONNECT:", $0
exit
}
$5==IP {
print "FOUND RECONNECT BEFORE DISCONNECT"
exit
}
' $INPUT
done < $INPUT
И немного изменив ввод, чтобы он выглядел так:
20180911,12:00,Chris,New,55567,
20180911,12:30,Tom,New,55577, <<<<<-Connections
20180911,12:45,Larry,New,55587,
20180911,14:00,,55567,
20180911,15:30,,55577, <<<<<-When user logs off
20180911,16:45,,55587,
20180911,16:45,Tom,New,55577, <<<<<-reconnect
20180911,16:45,55577, <<<<<-redisconnect
20180911,16:45,CURLY,New,55577, <<<<<-reconnect
20180911,16:45,MOE,New,55577, <<<<<- foobar
20180911,16:45,55577, <<<<<-redisconnect
Даёт это:
CONNECT: 20180911,12:00,Chris,New,55567,
DISCONNECT: 20180911,14:00,,55567,
CONNECT: 20180911,12:30,Tom,New,55577, <<<<<-Connections
DISCONNECT: 20180911,15:30,,55577, <<<<<-When user logs off
CONNECT: 20180911,12:45,Larry,New,55587,
DISCONNECT: 20180911,16:45,,55587,
CONNECT: 20180911,16:45,Tom,New,55577, <<<<<-reconnect
FOUND RECONNECT BEFORE DISCONNECT
CONNECT: 20180911,16:45,CURLY,New,55577, <<<<<-reconnect
FOUND RECONNECT BEFORE DISCONNECT
CONNECT: 20180911,16:45,MOE,New,55577, <<<<<- foobar
Что я думаю, это то, что вы хотите. Я подозреваю, что в ваших реальных данных вам нужно будет добавить больше условных выражений, чтобы убедиться, что пользователи и порты имеют смысл.
Сложным способом было бы сделать это (весь скрипт) на python или perl и использовать многострочное регулярное регулярное выражение.
**** Обратите внимание, что скрипт awk
обновлен, но ввод / вывод по-прежнему оригинален