format output


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting format output
# 1  
Old 11-16-2006
format output

I have a text file that I want a script to parse and grab only the relavent stuff.

No idea where to start..

This is the text file.
Code:
212   0.00000            ? -> (multicast)  ETHER Type=2000 (Unknown), size = 344 bytes

           0: 0100 0ccc cccc 000b 5f95 0fbe 014a aaaa    ........_....J..
          16: 0300 000c 2000 02b4 3fca 0001 0024 5442    .... ...?....$TB
          32: 4130 3533 3530 3639 3528 3533 3063 732d    A05350695(630cs-
          48: 6336 3530 392d 3364 6363 332d 3129 0002    c6509-3dcc3-1)..
          64: 0011 0000 0001 0101 cc00 040a 0000 0200    ................
          80: 0300 0836 2f32 3300 0400 0800 0000 2a00    ...6/23.......*.
          96: 0500 6457 532d 4336 3530 3920 536f 6674    ..dWS-C6509 Soft
         112: 7761 7265 2c20 5665 7273 696f 6e20 4d63    ware, Version Mc
         128: 7053 573a 2037 2e33 2832 2920 4e6d 7053    pSW: 7.3(2) NmpS
         144: 573a 2037 2e33 2832 290a 436f 7079 7269    W: 7.3(2).Copyri
         160: 6768 7420 2863 2920 3139 3935 2d32 3030    ght (c) 1995-200
         176: 3220 6279 2043 6973 636f 2053 7973 7465    2 by Cisco Syste
         192: 6d73 0a00 0600 0c57 532d 4336 3530 3900    ms.....WS-C6509.
         208: 0900 086d 6169 6e00 0a00 0600 7100 0b00    ...main.....q...
         224: 0501 0012 0005 0000 1300 0500 0014 0017    ................
         240: 3533 3063 732d 6336 3530 392d 3364 6363    630cs-c6509-3dcc
         256: 332d 3100 1500 0e06 082b 0601 0401 0905    3-1......+......
         272: 2c00 1600 1100 0000 0101 01cc 0004 0a00    ,...............
         288: 0002 0017 0036 0035 3330 2063 6f6c 6c69    .....6.630 cobbi
         304: 6e73 2053 7472 6565 742c 204c 6576 656c    ns Street, Level
         320: 332c 2044 6174 6120 4365 6e74 7265 2c20    3, Data Centre,
         336: 4361 6269 6e65 7433                        Cabinet3

And this is the output I want from the script.
Code:
A05350695(630cs-c6509-3dcc3-1)

Switch Port 6/23

WS-C6509 Software, Version McSW: 7.3(2) NmpSW: 7.3(2)
Copyright (c) 1995-2002 by Cisco Systems

630cs-c6509-3dcc3-1
630 cobbins Street, Level3, Data Centre, Cabinet3

Basically I want the info that is at the end of the text file, and it needs to be printed as above.
Tornado
# 2  
Old 11-16-2006
Here is how I would approach it. I only saved the first 2 items, but the rest is more of the same. I left some debug output in for now to show what is going on.

Code:
$ cat reader
#! /usr/bin/ksh

exec < text
read garbage
read garbage


item1=""
item2=""

IFS=""
while read line ; do
        line=${line##+( )}
        address=${line%%: *}
        line=${line##*    }
        echo address = $address "    " line ="\"$line"\"
        case $address in
        32)
                item1="$line"
                ;;
        48)
                line=${line%%.*}
                item1="${item1}${line}"
                ;;
        80)
                line=${line#???}
                line=${line%%.*}
                item2="$line"
                ;;
        esac
done

echo item1 = $item1
echo item2 = $item2

exit 0
$ ./reader
address = 0      line ="........_....J.."
address = 16      line =".... ...?....$TB"
address = 32      line ="A05350695(630cs-"
address = 48      line ="c6509-3dcc3-1).."
address = 64      line ="................"
address = 80      line ="...6/23.......*."
address = 96      line ="..dWS-C6509 Soft"
address = 112      line ="ware, Version Mc"
address = 128      line ="pSW: 7.3(2) NmpS"
address = 144      line ="W: 7.3(2).Copyri"
address = 160      line ="ght (c) 1995-200"
address = 176      line ="2 by Cisco Syste"
address = 192      line ="ms.....WS-C6509."
address = 208      line ="...main.....q..."
address = 224      line ="................"
address = 240      line ="630cs-c6509-3dcc"
address = 256      line ="3-1......+......"
address = 272      line =",..............."
address = 288      line =".....6.630 cobbi"
address = 304      line ="ns Street, Level"
address = 320      line ="3, Data Centre,"
address = 336      line ="Cabinet3"
address =      line =""
item1 = A05350695(630cs-c6509-3dcc3-1)
item2 = 6/23
$

# 3  
Old 11-16-2006
Thanks for that.
I will work through the script..
Tornado
# 4  
Old 11-17-2006
This script rebuilds the data from the hex codes...
Code:
awk 'BEGIN{
        for(i=0; i<=256; i++)
           a[sprintf("%02x",i)] = ((i<32||i>126) ? "\n" : sprintf("%c",i))
     }
     $1~/:$/{
        for(i=2; i<=9; i++)
           if($i ~ /^....$/)
              printf a[substr($i,1,2)] a[substr($i,3,2)]
     }' file1 | awk NF

...which gives...
Code:
_
J
?
$TBA05350695(530cs-c6509-3dcc3-1)
6/23
*
dWS-C6509 Software, Version McpSW: 7.3(2) NmpSW: 7.3(2)
Copyright (c) 1995-2002 by Cisco Systems
WS-C6509
main
q
530cs-c6509-3dcc3-1
+
,
6
530 collins Street, Level3, Data Centre, Cabinet3

# 5  
Old 11-17-2006
How would I execute that code ?
I'm on a Solaris system(if that makes any difference)..
Tornado
# 6  
Old 11-17-2006
On Solaris, use nawk.
# 7  
Old 11-18-2006
Thanks.. I just tried it using nawk and it works well..

Anyway just to let you guys know what I was doing.
I'm using a script to find out which CISCO switchport the server is connected to. You run the script and pass your interface to it.

ie:
whichport eri0

This is the script so far..
I will break it out into functions and add a usage function aswell.
Code:
#!/bin/ksh

    INT=$1

    echo "Collecting packets on the network..."
    snoop -d $INT -o /tmp/of.1 &
    #
    # every 60 seconds Cisco sends out a packet that contains good information
    #
    echo "0 sec.."
    sleep 15
    echo "15 sec.."
    sleep 15
    echo "30 sec.."
    sleep 15
    echo "45 sec.."
    sleep 15
    echo "60 sec.."
    sleep 3
    echo "63 sec.."
    #
    # we will wait for 60+ seconds to make sure we get the special packet
    #
    pkill snoop
    #
    # the ether packet type 2000 needs to be found
    #
    echo "Creating ASCII file..."
    snoop -vv -i /tmp/of.1 > /tmp/of.2
    #
    # get the line number the ether packet type 2000 is at
    #
    line=`grep -n "ETHER:  Ethertype = 2000 (Unknown)" /tmp/of.2 | awk '{FS=":"} { print $1 }' | head -1`
    if [ -z $line ]; then
            echo "Could not find a CDP packet, exiting."
            rm /tmp/of.1 /tmp/of.2
            exit 1
    fi

    echo "Found the Ethertype = 0x2000 on line = $line..."
    #
    # from the line go back 6 and pick out the first line and then the 3rd field = packet number
    #
    packetnumber=`cat /tmp/of.2 | head -${line} | tail -6 | head -1 | awk '{ print $3 }'`
    echo "Found the Ethertype = 0x2000 in packet = $packetnumber..."
    #
    # get the content of the packet which has the switch port the server is plugged into
    #
    snoop -i /tmp/of.1 -p${packetnumber} -x 0 >> /tmp/of.3
    #

cat /tmp/of.3 | sed -e 's/     *//' >> /tmp/of.4

    exec < of.4
    read garbage
    read garbage

    SN=""
    PORT=""
    SW=""
    LCT=""

    IFS=""
    while read line ; do
        line=${line##+( )}
        address=${line%%: *}
        line=${line##*    }
#       echo address = $address "" line ="\"$line"\"
        case $address in
        32)
                SN="$line"
                ;;
        48)
                line=${line%%.*}
                SN="${SN}${line}"
                ;;
        80)
                line=${line#???}
                line=${line%%.*}
                PORT="$line"
                ;;
        96)
                line=${line#??}
                SW="$line"
                ;;
        112)
                line="$line"
                SW="${SW}${line}"
                ;;
        128)
                    line="$line"
                SW="${SW}${line}"
                ;;
        144)
                line="$line"
                SW="${SW}${line}"
                ;;
        160)
                line="$line"
                SW="${SW}${line}"
                ;;
        176)
                line="$line"
                SW="${SW}${line}"
                ;;
        192)
                line=${line%%.*}
                SW="${SW}${line}"
                ;;
        288)
                line=${line#???????}
                LCT="$line"
                ;;
        304)
                line="$line"
                LCT="${LCT}${line}"
                ;;
        320)
                line="$line"
                LCT="${LCT}${line}"
                ;;
        336)
                line="$line"
                LCT="${LCT}${line}"
                ;;
        esac
    done

    echo""
    echo""
    echo "     `uname -n` is connected to CISCO Switch $SN , Port $PORT"
    echo "     The switch is located at $LCT"
    echo "     and has the following software loaded:"
    echo "     $SW"
    echo""
    echo""

rm /tmp/of.1 /tmp/of.2 /tmp/of.3 /tmp/of.4
exit 0

note the tab removal in sed.
Code:
# cat -vet whichport | grep sed
cat /tmp/of.3 | sed -e 's/^I*//' >> /tmp/of.4$
#

To shorten it a bit more I think I might use the nawk command to strip out the info I want.
Here is the script that i think I will continue to work on..
just need to split it out into functions, add a few more tests, a usage function and a disply function, to format the display in a better readable format.

Anyway the bulk of the code is here for you to use if you like...
As before you need to pass in the interface you wish to use.
Code:
#!/bin/ksh
#

echo "Collecting packets on the network..."
snoop -d $1 -o /tmp/of.1 &
#
# every 60 seconds Cisco sends out a packet that contains good information
#
echo "0 sec.."
sleep 15
echo "15 sec.."
sleep 15
echo "30 sec.."
sleep 15
echo "45 sec.."
sleep 15
echo "60 sec.."
sleep 3
echo "63 sec.."
#
# we will wait for 60+ seconds to make sure we get the special packet
#
pkill snoop
#
# the ether packet type 2000 needs to be found
#
echo "Creating ASCII file..."
snoop -vv -i /tmp/of.1 > /tmp/of.2
#
# get the line number the ether packet type 2000 is at
#
line=`grep -n "ETHER:  Ethertype = 2000 (Unknown)" /tmp/of.2 | awk '{FS=":"} { print $1 }' | head -1`
if [ -z $line ]; then
        echo "Could not find a CDP packet, exiting."
        rm /tmp/of.1 /tmp/of.2
        exit 1
fi

echo "Found the Ethertype = 0x2000 on line = $line..."
#
# from the line go back 6 and pick out the first line and then the 3rd field = packet number
#
packetnumber=`cat /tmp/of.2 | head -${line} | tail -6 | head -1 | awk '{ print $3 }'`
echo "Found the Ethertype = 0x2000 in packet = $packetnumber..."
#
# get the content of the packet which has the switch port the server is plugged into
#
snoop -i /tmp/of.1 -p${packetnumber} -x 0 >> /tmp/of.3

nawk 'BEGIN{
        for(i=0; i<=256; i++)
           a[sprintf("%02x",i)] = ((i<32||i>126) ? "\n" : sprintf("%c",i))
     }
     $1~/:$/{
        for(i=2; i<=9; i++)
           if($i ~ /^....$/)
              printf a[substr($i,1,2)] a[substr($i,3,2)]
     }' /tmp/of.3 | nawk NF

rm /tmp/of.1 /tmp/of.2 /tmp/of.3
exit 0

There's two version there for anyone to play around with and use if you like..
Tornado
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Format output

Hello Team, I have the following details in a txt file (please note the spaces and tabs) C1 C2 C3 ------------------ --------------- ------------- abc, xyz 2 8 pqr 2 ... (9 Replies)
Discussion started by: H squared
9 Replies

2. Shell Programming and Scripting

Format with output

I have written some scripts that resulted in the table below (Column1 is ITEM, Column2 is Group, Column3 is Category and Column4 is Quantity) but I want the output in another format: Input: K123 X CATA 3 K123 Y CATA 4 K123 Z CATA 2 K123 X CATB 5 K123 Y CATB 2 K123 Z CATB 2 B65 M CATB... (7 Replies)
Discussion started by: aydj
7 Replies

3. Shell Programming and Scripting

Script to generate Excel file or to SQL output data to Excel format/tabular format

Hi , i am generating some data by firing sql query with connecting to the database by my solaris box. The below one should be the header line of my excel ,here its coming in separate row. TO_CHAR(C. CURR_EMP_NO ---------- --------------- LST_NM... (6 Replies)
Discussion started by: dani1234
6 Replies

4. UNIX for Dummies Questions & Answers

Format Output

Hello Learned People, Good evening. I have absolutely no idea as how to do this & I admit that I do not know anything in unix. I must learn this one of these days. Im a help desk incharge today & someone gave me this file to be formatted & I have a file like this. vi NewFile.txt 232... (8 Replies)
Discussion started by: RTAN
8 Replies

5. Shell Programming and Scripting

Dynamic output file generation using a input text file with predefined output format

Hi, I have two files , one file with data file with attributes that need to be sent to another file to generate a predefined format. Example: File.txt AP|{SSHA}VEEg42CNCghUnGhCVg== APVG3|{SSHA}XK|"password" AP3|{SSHA}XK|"This is test" .... etc --------- test.sh has... (1 Reply)
Discussion started by: hudson03051nh
1 Replies

6. UNIX for Advanced & Expert Users

format df -k output

i am running df -k command on aix machine. i got the output like this. i need to store into file and send that file into microsoft excel.i need to allign properly. Filesystem 512 blocks Free % Used Iused %Iused Mounted on /dev/hd4 262144 126488 52% ... (9 Replies)
Discussion started by: wintercoat
9 Replies

7. Shell Programming and Scripting

Help in Getting specified output format

Hi all, I have input text file of this format objectclass:endeavor pid:12345 postalAddress:379 PROSPECT ST street:STE B l:TORRINGTON st:CT postalCode:067905238 telephoneNumber:9999999999... (2 Replies)
Discussion started by: pintoo
2 Replies

8. Shell Programming and Scripting

How to format output

Dear all, I have written a program which access database and displays the values returned by the query . There are 10 columns to be displayed in one row. But am ending with 5 lines displayed on 1st line and the next 5 in the 2nd line. Ex : 21608 10-20-2007 148 Al's Appliance... (7 Replies)
Discussion started by: uday542
7 Replies

9. Shell Programming and Scripting

capturing output from top and format output

Hi all, I'd like to capture the output from the 'top' command to monitor my CPU and Mem utilisation.Currently my command isecho date `top -b -n1 | grep -e Cpu -e Mem` I get the output in 3 separate lines.Tue Feb 24 15:00:03 Cpu(s): 3.4% us, 8.5% sy .. .. Mem: 1011480k total, 226928k used, ....... (4 Replies)
Discussion started by: new2ss
4 Replies

10. UNIX for Dummies Questions & Answers

ls output format

below is the output is ls -l -rw-r--r-- 1 tonyt staff 3212 Apr 17 1999 file1 -rw-r--r-- 1 tonyt staff 4541 Mar 3 21:08 file2 why the date format is not the same? (6 Replies)
Discussion started by: tonyt
6 Replies
Login or Register to Ask a Question