Date: Thu, 7 Jul 2005 14:39:44 -0300 From: Alejandro Pulver <alejandro@varnet.biz> To: fbsd_user@a1poweruser.com Cc: "freebsd-questions@FreeBSD. ORG" <freebsd-questions@FreeBSD.ORG> Subject: Re: help with she script Message-ID: <20050707143944.4b552b2b@phobos.mars.bsd> In-Reply-To: <MIEPLLIBMLEEABPDBIEGGEFDHIAA.fbsd_user@a1poweruser.com> References: <20050703181722.6d20fe89@phobos.mars.bsd> <MIEPLLIBMLEEABPDBIEGGEFDHIAA.fbsd_user@a1poweruser.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 6 Jul 2005 23:29:17 -0400 "fbsd_user" <fbsd_user@a1poweruser.com> wrote: > On Sun, 3 Jul 2005 16:47:24 -0400 > "fbsd_user" <fbsd_user@a1poweruser.com> wrote: > > > This is my last coding problem. > > > > > > target="check-state" > > > > # Find the rule number of the target rule where you want the > doorman > > # pass rules inserted before. > > > > ruleno=`ipfw list | sed -n -e "s/00\([0-9]*\) $target/\1/p"` > > > > The output of 'ipfw list' looks like this > > > > nnnnn a 5 position sequence rule number > > blank followed by a empty single position > > x-x a 10 to 80 position rule text > > > 00010 allow ip from any to any via lo0 > 00015 check-state > 00110 allow tcp from any to 68.168.240.26 dst-port 53 out via dc0 > setup keep-state > 00111 allow udp from any to 68.168.240.26 dst-port 53 out via dc0 > keep-state > 00120 allow udp from any to any dst-port 67 out via dc0 keep-state > 00200 allow tcp from any to any dst-port 80 out via dc0 setup > keep-state > > > > > > When the rule text matches the target text I want the > > first 5 position rule number to go into ruleno. > > > > Large rules files may use all 5 positions and then > > the above code will fail to get the rule number. > > Tried to remove the s/00\ but had syntax problems. > > Hello, If you want to include the first two digits you have to remove the two zeros from the pattern. ruleno=`ipfw list | sed -n -e "s/\([0-9]*\) $target/\1/p"` ^^ This is because in the other pattern when the rule number does not start with "00" then it will not be matched and nothing will be returned. Explanation: The 's' is the substitute command, '/' is the operand separator, the '\(' and '\)' construct saves the text it matches in the register '\1', '[0-9]*' matches any number of digits (even 0 of them), $target is replaced with the contents of the shell variable. All of that is replaced by just the text matched between '\(' and '\)'. The 'p' flag causes the line (after substitution, that is, the text between '\(' and '\)') to be printed (and assigned to ruleno). Hope that helps. Best Regards, Ale
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050707143944.4b552b2b>