How to parse..


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to parse..
# 1  
Old 05-06-2003
How to parse..

Help, I need to get the port number of a Oracle database using the tnsping command. I need to parse it's output.

=====================
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(Host=chamar)(Port=1541))

Sometimes may be like this:

Attempting to contact (ADDRESS=(COMMUNITY=TCP.WORLD)(PROTOCOL=TCP)(Host=chamar)(Port=1541))
=====================

Also, sometimes Port will be PORT or port.

I tried using awk and delimiting by = but sometimes there are more = than I expect..

Thanks for your help.

Last edited by natter; 05-06-2003 at 05:22 PM..
# 2  
Old 05-07-2003
You could use the substr function of awk:

awk '{ print substr ($0, length ($0) - 5, 4)}' someFile

or:

port="Attempting to contact (ADDRESS=(PROTOCOL=TCP)(Host=chamar)(Port=1541))"
echo $port | awk '{ print substr ($0, length ($0) - 5, 4)}'
# 3  
Old 05-07-2003
Code:
tnsping PROD | awk '/Attempting/ {
gsub("[()=]"," ")
$0=toupper($0)
for (i=1;i<=NF;i++)
   if ($i=="PORT")
       {print $(i+1)
        exit}
}' | read port

echo "port=$port"

Above script simplifies the parsing task by first cleaning up the line, then scans the line for PORT and prints the word after. Port number can be more than 4 digits.

I think the line of interest is always just one line, correct? You show one sample as being on two lines. If so, just change the first line to:

tnsping PROD | awk '{

and it will parse each line until PORT is found.
Jimbo
# 4  
Old 05-10-2003
Great, thanks very much for the replies.

I'll try both ways. I was stuck.
# 5  
Old 05-14-2003
Assuming your awk is nawk, you can (probably) do this:
Code:
tnsping PROD | awk '/Attempting/ {
        s = toupper($0)
        if (!match(s, /PORT=[0-9]+/)
            print "Where's the port?" > "/dev/tty"
            exit(1)
        else
            port = substr(s, RSTART+5, RLENGTH-5)
    }' | read port
echo "port = " $port

The regexp may need to be adjusted to /PORT=[0-9][0-9]*/ if your awk doesn't like the +.

If your output may actually come out on multiple lines per the formatting of your original post, but the "port=" and its port number will always be on the same line, you can shortcut the above this way:
Code:
tnsping PROD | awk 'match(toupper($0), /PORT=[0-9]+/) {
        print substr($0, RSTART+5, RLENGTH-5)
}' | read port
echo "port = " $port

The secret here is to realize that the pattern does not have to be a regular expression. Be a little careful: There's only one RSTART/RLENGTH pair, so more than one "match" in an expression (in the pattern or the action) will only get set RSTART & RLENGTH for the last "match" evaluated.
# 6  
Old 05-21-2003
Bug

I like to use awk because its pretty powerful, but I also like to try to achieve the same results with other tools. Here is my bid which works every time:

$ echo "Attempting to contact (ADDRESS=(PROTOCOL=TCP)(Host=chamar)(Port=1541))"
|tr -d ")" | cut -d"(" -f5 | cut -d"=" -f2

Good luck!
# 7  
Old 05-21-2003
Computer

This is even better:

$ echo "Attempting to contact (ADDRESS=(PROTOCOL=TCP)(Host=chamar)(Port=1541))"
|tr -d ")" | cut -d"=" -f5

Should've thought of this the first time.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Parse with SQL

I am trying to parse a string using SQL but am too new and still learning. I have text in a control or field 685 that is variable, but always the same format. field 685 input arr 2q33.3q34(200,900,700-209,000,000)x2 xxx Desired output 2:200900700-209000000 Basically, the # after the... (2 Replies)
Discussion started by: cmccabe
2 Replies

2. Shell Programming and Scripting

Parse html

I downloaded source code using: wget -qO- http://fulgentdiagnostics.com/test/clinical-exome/ | cat > flugentsource.txt Now I am trying to use sed to parse it to confirm a gene count. Basically, output (flugent.txt) all the gene names with a total count after them I'm not all that... (5 Replies)
Discussion started by: cmccabe
5 Replies

3. Shell Programming and Scripting

Parse

Attached file is parsed so that only the three columns result. DACH1 occurs 34 times with an average of 0.881541 NEB occurs 159 times with an average of 0.837628 LTBP1 occurs 46 times with an average of 0.748722 parse result: output.txt (the text is removed and the xxx is seperated in a... (6 Replies)
Discussion started by: cmccabe
6 Replies

4. Shell Programming and Scripting

Parse 2 or more files into one.

Hi, I have a really simple question...I think. I want to be able to parse two or more files into one by reading the first record from each file into new file then go back to the first file and start reading the second record in from each file into new file and so on. I am new to using awk and am... (5 Replies)
Discussion started by: qray2011
5 Replies

5. Shell Programming and Scripting

How to Parse a Prompt?

On the command, when I type in certain commands, they will display a prompt waiting for some input. When I type in the requested input, it will display the info I requested. For example, if I enter the telnet command, it will display a telnet prompt and wait for me to enter something. I... (1 Reply)
Discussion started by: april
1 Replies

6. Shell Programming and Scripting

Perl Parse

Hi I'm writing simple perl script to parse the ftp log as below: Local directory now /home/user/testing 227 Entering Passive Mode (192,254,19,34,8,228). 125 Data connection already open; Transfer starting. 09-25-09 02:33PM 25333629 abc.tar 09-14-09 12:50PM 18015752... (1 Reply)
Discussion started by: netxus
1 Replies

7. Shell Programming and Scripting

Parse

I need a script that will always return an engine of table, which not depends on the table structure. I need it to be done exactly from the "show create table ..." statement. If there is a easiest way, except "show table status", please write. mysql -u root db -sBe "show create table... (1 Reply)
Discussion started by: mirusnet
1 Replies

8. Shell Programming and Scripting

Need help to parse the file

# Start "ABC" SFFd 0 4 Time SFFT 4 8 {Sec} User SFFTimeVal 12 8 {Sec} # Start "CP" SFFT ... (3 Replies)
Discussion started by: navsharan
3 Replies

9. UNIX for Advanced & Expert Users

Parse error

hi,:) onsider the followinf two lines J="$(scriptbc -p 8 $I / \(12 \* 100 \) )" N="$(( $L * 12 ))" In the first line I put \ before * like \* and its working fine. But in the second line if put \ before * i am getting parse error. What might be the reason?Any idea pls. cheers RRK (1 Reply)
Discussion started by: ravi raj kumar
1 Replies

10. Shell Programming and Scripting

Parse

Does anybody know how do we parse a file (ex. SIF file) into a delimited text file in UNIX? (7 Replies)
Discussion started by: nguda
7 Replies
Login or Register to Ask a Question