![]() |
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here. |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| File processing line by line | suma | Shell Programming and Scripting | 1 | 07-19-2008 06:01 PM |
| Problem with reading file line-by-line, and outputting to a new file | Darkness Fish | Shell Programming and Scripting | 4 | 07-18-2008 06:54 AM |
| reading text file line by line | MizzGail | Shell Programming and Scripting | 6 | 04-14-2008 06:58 AM |
| Line by line file reading... and more! | ProFiction | Shell Programming and Scripting | 6 | 07-26-2007 11:32 AM |
| Reading line by line from a file | tej.buch | Shell Programming and Scripting | 2 | 01-23-2006 02:50 AM |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Reading a file line by line and processing for each line
Hi,
I am a beginner in shell scripting. I have written the following script, which is supposed to process the while loop for each line in the sid_home.txt file. But I'm getting the 'end of file' unexpected for the last line. The file sid_home.txt gets generated as expected, but the script doesn't execute the instructions in the while loop: #!/bin/ksh cd /home/dba/utils/scripts/monitor sed '/^#.*$/d' /var/opt/oracle/oratab | sed '/^[Cc]lient.*$/d' | sed '/^CRS.*$/d' | awk -F: '{print$1, $2;}' > sid_home.txt { while read LINE;do ORACLE_SID=`awk '{print $1;}' $LINE`; export ORACLE_SID ORACLE_HOME=`awk '{print $2;}' $LINE`; export ORACLE_HOME DATE_TIME=`date +%m%d%y%a_%H%M`; export DATE_TIME TSPALERT_LOG=tspalert_${ORACLE_SID}_${DATE_TIME}.log;export TSPALERTLOG ORACLE_BASE=${ORACLE_HOME}; export ORACLE_BASE ORACLE_BIN=${ORACLE_HOME}/bin; export ORACLE_BIN LD_LIBRARY_PATH=/usr/openv/netbackup/bin:/usr/dt/lib:/usr/openwin/lib:/usr/local/lib:${ORACLE_HOME}/lib32 LD_LIBRARY_PATH_64=${ORACLE_HOME}/lib ORACLE_DOC=${ORACLE_HOME}/orainst/doc ${ORACLE_HOME}/bin/sqlplus -s /nolog << EOF set heading off spool $TSPALERT_LOG; select name from v$database; select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual; select tablespace_name,sum(bytes)/1048576 MBUsed, sum(maxbytes)/1048576 TotalMB, sum(bytes)/sum(maxbytes)*100 PercentUsed from dba_data_files group by tablespace_name having sum(bytes)/sum(maxbytes)*100 >= 80; spool off EXIT; EOF if [ -f ${TSPALERT_LOG} ]; then echo "**ERROR**: TABLESPACE NEARLY FULL OR NOT ENOUGH ROOM FOR THE NEXT EXTENT IN ${ORACLE_SID}. Check log ${TSPALERT_LOG} " > /dev/null mv ${TSPALERT_LOG} ${TSPALERT_LOG}.old > /dev/null fi done } < sid_home.txt |
|
||||
|
Beginner? This is one of the better ksh codes that I have seen. And believe me - I have seen plenty od it.
Some hints that might help you: - Try enclosing variables with quotes: variable="${var}" (the way you are using could work fine but under some circumstances you can get into problems - an example is when ${var} is equal to 'some text with $trange characters'). - I'm not sure if there is a need to enclose that function within brackets - if I remember correct you should be able to "print" the file into the loop without brackets - Send this sid_home.txt file and make sure that the problem is not related to end of line characters (unix/max/windows format) - if you send it then I could take a look onto it - Use tabulation - this code you have sent is not very readable - You might try the alternative syntax as well (might be worth giving a try): cat "${file}" | while $(read LINE);do ... done - Execute your code with "set -x;set -v" and check the output. You might try some debuggers as well. |
|
|||||
|
Reply
Quote:
Quote:
Code:
LD_LIBRARY_PATH_64=${ORACLE_HOME}/lib
Would work with modern shells but would fail with many others. Quote:
You should always try alternative solutions if you cannot find the bug and the alternative solution is simple/quick to implement. After your alternative code works you might trace the source by comparing the two versions. Quote:
In that case the line written by me should be: Quote:
|
|
|||||
|
Quote:
Quote:
|
|
||||
|
Well.... then I have been using the wrong bourne-type shells. Was I?
I guess that instead of helping sagarparadkar this discussion has now changed the topic. Sagarparadkar, could you provide some example data file to us? Could you verify that the End Of Line characters are correct fr your script and input file? |
|
||||
|
Hi Derek and Johnson,
Thanks a lot for your inputs. I tried playing around my code, and finally came up with the following version of code, which I found working. I am sure this version also can be optimized a lot further. The script gets the ORACLE_SID and ORACLE_HOME from oratab file to sid_home.txt file, both separated by a space character. I could have directly read the oratab file, but I didn't want to have trial and error of my script directly with that file. cd /home/dba/utils/scripts/monitor sed '/^#.*$/d' /var/opt/oracle/oratab | sed '/^[Cc]lient.*$/d' | sed '/^CRS.*$/d' | awk -F: '{print$1, $2;}' > sid_home.txt while read LINE do ORACLE_SID=`echo ${LINE}|cut -d" " -f1`; export ORACLE_SID!eof done < sid_home.txt |
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|