There are ofcourse multiple ways of doing this.
I'm going to assume that the file is consecutive and that all the "entrys" contains name and state (this will minimize the size of the scripts).
Code:
#!/bin/bash
# Path to file
file="/path/to/file"
# Creates a list containing only "name:" and "state:" fields.
list=$(cat $file | egrep "(name|state):"
x=0
# Inserts the list into an array for easier access later on.
for i in $list; do
array[$x]=$i
((x++))
done
# Here's the magic, The loop will continue until the condition is met, meaning that a element is empty :)
x=0
until [ -z $array[$x] ]; do
# Chops out the "name: " part of the string
name=$(echo ${array[$x]} | sed -e "s/^[^:]\+: //")
# Increases the positioning variable so we can get the next row
((x++))
# Chops out the "state: " part of the string
state=$(echo ${array[$x]} | sed -e "s/^[^:]\+: //")
# Increases the positioning variable so it's at the right place next itteration
((x++))
# Outputs the name and state on the same row :)
echo "$name $state"
done
If you want just the name and the state on seperate rows then this is a easy fix

Code:
# cat file.txt | egrep "(name|state):"
If the file isn't consecutive then this script is useless without modification... The issue which it has is there is no checks at all if the next line is the one which should be there.
If 1 entry is missing the state field then all other will get out of alignment. This can be solved by adding if-conditions to check if the line is a "state:" line or not. Also it will probably make some funny results if the sed doesn't match the line

ps. none of the examples or suggestion I've given has been tested

ds.
Best regards
Fredrik Eriksson