ramblinman
ramblinman

Reputation: 3

grep statement in bash

I am using a for loop to connect to a list of servers and perform some simple commands. If the server is not accessible then stderr is written to a file. I then grep that file for the server name. It seems relatively simple and for some reason it isn't working. For troubleshooting purposes I have narrowed my server list to two servers and only run simple commands.

for i in $(cat serverlist)
do
    nexec -i $i hostname 2>>errorlog.txt
    if grep -q $i errorlog.txt; then echo "error accessing" $i
    else echo "was able to connect to" $i
    fi
done

So in the serverlist I have defined two incorrect hosts for troubleshooting purposes. Nexec tries to connect to each and perform the hostname command. If it is unable to connect an error message is printed to errorlog.txt

e.g., nexec: Error accessing host test1

Since both servers are incorrectly specified I am not able to connect to either. Again for troubleshooting purposes.

When grep runs the first time against $i which is the first server in the list it doen't find any matches in error.txt. However, it should. If I cat the results instead of grepping it is there.

I am actually doing this in bladelogic so the rules are a bit different. It should still work.

Upvotes: 0

Views: 230

Answers (2)

Charles Duffy
Charles Duffy

Reputation: 295736

while read -r i <&3; do
    nexec -i "$i" hostname 2>>"errorlog.$i.txt" || {
      echo "nexec for $i exited with status $?" >&2
      continue
    }
    # check for case where it claimed success but actually failed
    # if nexec is written correctly, you don't need any of this logic
    # ...and can completely remove the rest of the loop.
    if grep -q -e "$i" "errorlog.$i.txt"; then
      echo "error accessing $i" >&2
    else
      echo "was able to connect to $i" >&2
    fi
done 3<serverlist

# and combine all the individual logs into one file:
cat errorlog.*.txt >errorlog.txt && rm -f -- errorlog.*.txt

Upvotes: 1

soupmagnet
soupmagnet

Reputation: 332

Not familiar with nexec, but I imagine something like this is what you are looking for

for i in $(cat serverlist)
do
    if [ ! "$(nexec -i $i hostname)" ]
        then echo "error accessing" $i
      else echo "was able to connect to" $i
    fi
done

Upvotes: 0

Related Questions