The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



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
Format output using awk in script. bperl Shell Programming and Scripting 8 01-14-2008 01:09 AM
[need help] output format from awk bucci Shell Programming and Scripting 6 02-09-2007 04:41 AM
Output in a particular format using AWK Raynon Shell Programming and Scripting 4 01-24-2007 04:07 AM
ls output format tonyt UNIX for Dummies Questions & Answers 6 11-23-2001 11:31 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 11-16-2006
Tornado's Avatar
Tornado Tornado is offline Forum Advisor  
Registered User
  
 

Join Date: Nov 2006
Location: Melbourne
Posts: 249
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.
  #2 (permalink)  
Old 11-16-2006
Perderabo's Avatar
Perderabo Perderabo is offline Forum Staff  
Unix Daemon
  
 

Join Date: Aug 2001
Location: Ashburn, Virginia
Posts: 9,111
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 (permalink)  
Old 11-16-2006
Tornado's Avatar
Tornado Tornado is offline Forum Advisor  
Registered User
  
 

Join Date: Nov 2006
Location: Melbourne
Posts: 249
Thanks for that.
I will work through the script..
  #4 (permalink)  
Old 11-17-2006
Ygor's Avatar
Ygor Ygor is offline Forum Staff  
Moderator
  
 

Join Date: Oct 2003
Location: -31.96,115.84
Posts: 1,407
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 (permalink)  
Old 11-17-2006
Tornado's Avatar
Tornado Tornado is offline Forum Advisor  
Registered User
  
 

Join Date: Nov 2006
Location: Melbourne
Posts: 249
How would I execute that code ?
I'm on a Solaris system(if that makes any difference)..
  #6 (permalink)  
Old 11-17-2006
Ygor's Avatar
Ygor Ygor is offline Forum Staff  
Moderator
  
 

Join Date: Oct 2003
Location: -31.96,115.84
Posts: 1,407
On Solaris, use nawk.
  #7 (permalink)  
Old 11-18-2006
Tornado's Avatar
Tornado Tornado is offline Forum Advisor  
Registered User
  
 

Join Date: Nov 2006
Location: Melbourne
Posts: 249
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..
Sponsored Links
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 06:27 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0