saving output from bash into a file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting saving output from bash into a file
# 1  
Old 06-16-2011
saving output from bash into a file

I am ssh to many servers to get some information... however sometimes the server is unreacheable and i am getting an error. I want to save that output to a file but I am not able to do so...

I want to be able to save output of bash into a file.. so when I run this command on a script
Code:
ssh abhapp01i.abh-sort.us.dhl.com

I get this line, saved into a file...
Code:
ssh: abhapp01i.abh-sort.us.dhl.com: Temporary failure in name resolution

I do this for may servers and I want to know to which servers I can login or not...

This is my current script...
Code:
for host in `cat $PATH_TEMP/servers_test.txt`
        do
                #LINUX SERVERS
#               var=`ssh $host uname -n`
#               echo -n $var ";">> $PATH_TEMP/valeria/reporte_test
                echo -n $(ssh $host cat /usr/openv/netbackup/exclude_list) >> $PATH_TEMP/valeria/reporte_test
                echo >> $PATH_TEMP/valeria/reporte_test
    done

this is the output on my bash when I run the script
Code:
[root@harp valeria]# sh unix_servers_test.sh
ssh: abhmq01.abh-sort.us.dhl.com: Temporary failure in name resolution
ssh: abhxdb01d.abh-sort.us.dhl.com: Temporary failure in name resolution
ssh: admpae1-65.phx-dc.dhl.com: Name or service not known

What I want is to have the previos lines added to my file, because the current file I end up looks like this...
Code:
/tmp/ /var/tmp/ /var/spool/mqueue /var/spool/sockets /usr/tmp/ /cdrom/ /SD_CDROM/ /mnt/ /tmp_mnt/ /dev/fd/ /proc/ /INFORMIXTMP/ /etc/mnttab core /Contentstore
_AMNO_PROD/ /Contentstore_AMNO_PROD_2/
/tmp/ /var/tmp/ /var/spool/mqueue /var/spool/sockets /usr/tmp/ /cdrom/ /SD_CDROM/ /mnt/ /tmp_mnt/ /dev/fd/ /proc/ /INFORMIXTMP/ /etc/mnttab core

So the first 3 lines that I see on my bash when I run my script need to be added to the file in order to end up with a file like this..
Code:
ssh: abhmq01.abh-sort.us.dhl.com: Temporary failure in name resolution
ssh: abhxdb01d.abh-sort.us.dhl.com: Temporary failure in name resolution
ssh: admpae1-65.phx-dc.dhl.com: Name or service not known
/tmp/ /var/tmp/ /var/spool/mqueue /var/spool/sockets /usr/tmp/ /cdrom/ /SD_CDROM/ /mnt/ /tmp_mnt/ /dev/fd/ /proc/ /INFORMIXTMP/ /etc/mnttab core /Contentstore
_AMNO_PROD/ /Contentstore_AMNO_PROD_2/
/tmp/ /var/tmp/ /var/spool/mqueue /var/spool/sockets /usr/tmp/ /cdrom/ /SD_CDROM/ /mnt/ /tmp_mnt/ /dev/fd/ /proc/ /INFORMIXTMP/ /etc/mnttab core

HOW CAN I ACCOMPLISH THIS, THANK YOU!!
# 2  
Old 06-16-2011
Code:
for host in `cat $PATH_TEMP/servers_test.txt`
        do
                #LINUX SERVERS
#               var=`ssh $host uname -n`
#               echo -n $var ";">> $PATH_TEMP/valeria/reporte_test
                echo -n $(ssh $host cat /usr/openv/netbackup/exclude_list) >> $PATH_TEMP/valeria/reporte_test
                echo >> $PATH_TEMP/valeria/reporte_test
    done

This has useless use of cat and useless use of backticks all over the place. ( $( ) is roughly equivalent to backticks.) Also, you don't need to tell every separate statement to write to your logfile, you can redirect your entire while loop to get the output of everything inside it.

Also, the errors are going to standard error, fd 2, not the usual standard output. You can redirect them like 2>file, or send them back into standard output with 2>&1

So, how about:

Code:
# if you're operating line by line anyway, 'while read' is more efficient than `cat file`
while read host
do
        # since we're running cat anyway, might as well run something that does
        # the entire job instead.  tr here turns newlines into spaces and prints.
        # We quote everything in "" so the single quotes don't get stripped off.
        ssh $host "tr '\n' ' ' < /usr/openv/netbackup/exclude_list" 2>&1
        echo
done < $PATH_TEMP/servers_test.txt > logfile

---------- Post updated at 11:53 AM ---------- Previous update was at 11:45 AM ----------

Quote:
I do this for may servers and I want to know to which servers I can login or not...
You don't even need the error text to know whether the server logged in or not, the program tells the shell whether it succeeded or not, directly. Every program you run returns an error code, zero for success, anything else for error.

Code:
# if you're operating line by line anyway, 'while read' is more efficient than `cat file`
while read host
do
        # since we're running cat anyway, might as well run something that does
        # the entire job instead.  tr here turns newlines into spaces and prints.
        # We quote everything in "" so the single quotes don't get stripped off.
        # 2>/dev/null gets rid of the error text, if any.
        if ssh $host "tr '\n' ' ' < /usr/openv/netbackup/exclude_list" 2>/dev/null
        then
                echo "$host success" >&2
        else
                echo "$host fail" >&2
        fi

        echo
        # Prints the data outputted by ssh $host into excludedata
        # prints whether it succeeded or failed into logintest
done < $PATH_TEMP/servers_test.txt > excludedata 2> logintest

# 3  
Old 06-16-2011
Thank you...
This accomplish some of what I need, that is printing the output to a file, but not in the way that I want to. I reallly apreciate the help!
this is more of what I need....

Code:
abhmq01.abh-sort.us.dhl.com fail
abhxdb01d.abh-sort.us.dhl.com fail
admpae1-65.phx-dc.dhl.com fail
AND WHEN IT SUCCEDS LOGIN IN TO SERVER....TO PRINT THE CONTENTS OF THE FILE /usr/openv/netbackup/exclude_list IN 1 LINE IN THE FORMAT YOU SUGGESTED...("tr '\n' ' ' < /usr/openv/netbackup/exclude_list")


Last edited by eponcedeleonc; 06-16-2011 at 04:30 PM..
# 4  
Old 06-16-2011
Quote:
Originally Posted by eponcedeleonc
Thank you...
This accomplish some of what I need, that is printing the output to a file, but not in the way that I want to. I reallly apreciate the help!
How exactly do you want it, then?
# 5  
Old 06-16-2011
in this example....this is my list of servers

abhmq01
abhxdb01
admpae1
admpce02
admtdb2

this is my script...
Code:
while read host
do
        # since we're running cat anyway, might as well run something that does
        # the entire job instead.  tr here turns newlines into spaces and prints
.
        # We quote everything in "" so the single quotes don't get stripped off.
        # 2>/dev/null gets rid of the error text, if any.
        if ssh $host "tr '\n' ' ' < /usr/openv/netbackup/exclude_list" 2>/dev/nu
ll
        then
                echo $(cat /usr/openv/netbackup/exclude_list) >&2
        else
                echo "$host fail" >&2
        fi

        echo
        # Prints the data outputted by ssh $host into excludedata
        # prints whether it succeeded or failed into logintest
done < servers_test > excludedata 2> logintest

However... I am not getting any input from server #4. This is my output.

abhmq01.abh-sort.us.dhl.com fail
abhxdb01d.abh-sort.us.dhl.com fail
admpae1-65.phx-dc.dhl.com fail
---> (I am missing input from server #4) this line was added by me to explain
/tmp/ /var/tmp/ /var/spool/mqueue /var/spool/sockets /usr/tmp/ /cdrom/ /SD_CDROM/ /mnt/ /tmp_mnt/ /dev/fd/ /proc/ /INFORMIXTMP/ /etc/mnttab core

However, the content of the file is written to the excludedata!
# 6  
Old 06-17-2011
It goes into excludedata because that's where you tell it to go.

Imagine you're putting ssh host cat file into a script file, and running the script. [icode]./script.sh[/icode would print it to your terminal. ./script.sh > excludedata would go into excludedata.

The idea of redirecting the end of a while-loop is the same. We can capture the output of that whole section of code, just like it was a separate script file. It's one of the shell's handier features.
Code:
while read host
do
        # think of 'tr' like 'cat' except here it changes newlines into spaces.
        # You don't have to mangle the text in your shell, it's already been
        # catted into standard output.  Which goes into excludedata.
        if ssh $host "tr '\n' ' ' < /usr/openv/netbackup/exclude_list"
        then
                # This won't work because it runs locally.
                # It's ALREADY BEEN PRINTED anyway.  
#              echo $(cat /usr/openv/netbackup/exclude_list) >&2

                echo # add a newline to the end, because tr deleted them all
        else
                # If it fails, it won't print any data, so we print something else.
                echo "$host fail"
        fi

done < servers_test > excludedata 2> logintest

excludedata will contain the contents of each server's /usr/openv/netbackup/exclude_list, or "hostname fail" if it couldn't get through to it. logintest will contain the error output of ssh such as 'ssh: abhmq01.abh-sort.us.dhl.com: Temporary failure in name resolution' if anything couldn't be contacted. This way you can keep the data and error messages separate to make your output much easier to use later.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed command is saving output as blank file

Hi, I am working on a script where I am adding adding colors to few of the info in the output. Now , after that is done , I see colour codes in log files which I don't want to see.:mad::mad::mad::mad: So , I tried using sed command in script as below which gives me o/p (new.log) as blank file... (7 Replies)
Discussion started by: Dream4649
7 Replies

2. Shell Programming and Scripting

Saving files with file name as output

Hi, i need help with a file creation of an output program. I've got a program that with #find creates an output for each files in a directory. If i give this command : -o spec$(date -u +%Y%m%dt%H%M) it creates just one file, overwriting all the others since it is the creation date .... (2 Replies)
Discussion started by: Board27
2 Replies

3. Shell Programming and Scripting

Saving nohup output to a file other than nohup.out

Shell : bash OS : Oracle Linux 6.4 I want to save the ouput of a nohup command to file other than nohup.out . Below are my 3 attempts. For both Attempt1 and Attempt2 , the redirection logs the output correctly to the output file. But I get the error "ignoring input and redirecting stderr to... (7 Replies)
Discussion started by: kraljic
7 Replies

4. Shell Programming and Scripting

looping and saving output of each line separately

I have been trying this program for a long time. I am trying to read a file named "odon" line by line; read the first line, send it to do a command saved in a file "perm", once the first line has finished going through the content of the file perm, the result is saved with the number of the line.... (17 Replies)
Discussion started by: iconig
17 Replies

5. Shell Programming and Scripting

Need some Help for file filteration and saving the output in other directory

Hi all........ Plss do help me.......in a big trouble... :wall::wall::wall: I have 3 directories named as :1. /home/shuchi/source 2./home/shuchi/destination 3./home/shuchi/filter now the problem is /home/shuchi/source has say 2 files with extension .txt as given below : A.txt msisdn ... (5 Replies)
Discussion started by: ektubbe
5 Replies

6. Shell Programming and Scripting

Need some Help for file filteration and saving the output in other directory using grep....plz ...

Hi all........ Plss do help me.......in a big trouble... :wall::wall::wall: I have 3 directories named as :1. /home/shuchi/source 2./home/shuchi/destination 3./home/shuchi/filter now the problem is /home/shuchi/source has say 2 files with extension .txt as given below : A.txt Code: ... (0 Replies)
Discussion started by: ektubbe
0 Replies

7. UNIX for Dummies Questions & Answers

Saving a temporary output within a script

Good morning everyone, i am looking to know how to save the output of a command and reuse it again within a script i already tired this one but it didn't work TEMPDIR=/dir1/dir2 My_command> $TEMPDIR/$TEMPFILE rm $TEMPDIR/$TEMPFILE* it keeps saying "cannot write to a... (15 Replies)
Discussion started by: Portabello
15 Replies

8. UNIX for Dummies Questions & Answers

saving command output to a variable

Hello, I have a shell script containing a command string in the following format: command1 | command2 | cut -c9-16 The output from this is a record number (using characters 9-16 of the original output string) e.g. ORD-1234 I wish to save this value to a variable for use in later commands... (4 Replies)
Discussion started by: philjo
4 Replies

9. Shell Programming and Scripting

saving awk value in a bash array variable

hi all i am trying to save an awk value into an array in bash: total=`awk '{sum+=$3} END {print sum}' "$count".txt"` ((count++)) the above statement is in a while loop.. $count is to keep track of file numbers (1.txt,2.txt,3.txt,etc.) i get the following error: ./lines1:... (1 Reply)
Discussion started by: npatwardhan
1 Replies

10. Shell Programming and Scripting

Saving output from awk into a perl variable

How would I pass awk output to a perl variable? For example, I want to save the value in the 4th column into the variable called test. My best guess is something as follow, but I am sure this isn't correct. $test = system("awk '/NUMBER/{print \$4}' $_"); (8 Replies)
Discussion started by: userix
8 Replies
Login or Register to Ask a Question