Não tenho certeza se isso funcionará para todas as combinações possíveis que você possa ter, mas funciona para a pequena amostra que você forneceu:
sed "1,\$s/state/\nstate/g" file | grep state > NewFile
for IPADDR in $(cat NewFile | cut -d"@" -f2|cut -d":" -f1|sort -n|uniq);do
for STATE in 2 4 ;do
LineCount=$(grep "${IPADDR}" NewFile |grep "state:: ${STATE}"| wc -l)
echo "For IP address ${IPADDR}, status:: ${STATE} lines count is ${LineCount}"
done
done | grep -v "is 0"$
você pode adicionar quantos números diferentes quiser no loop for dentro
Basicamente, você está inserindo um novo caractere de linha antes de cada ocorrência da string state
, fazendo seu grande bloco de dados, separando em várias linhas.