![]() |
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 |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|||||
|
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
$
|
|
|||||
|
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
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 |
|
|||||
|
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
Code:
# cat -vet whichport | grep sed cat /tmp/of.3 | sed -e 's/^I*//' >> /tmp/of.4$ # 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
|
| Sponsored Links | ||
|
|
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|