On Thu, May 27, 2010 at 12:28 AM, Roland Mainz <[email protected]> wrote:
> On Thu, May 27, 2010 at 12:17 AM, Jack Schwartz
> <[email protected]> wrote:
>> Thanks for helping...
> [snip]
>> # read file into variable "input"
>> input="$( < 'zzz' )"
>>
>> # pick the data, \3 refers to the content matched by the pattern in
>> the 3rd ()-bracket pair
>> match="${input/~(Elr-g).*([^[:space:]]*ramdisk[^[:space:]]*)([[:space:]]+)([^[:space:]])([[:space:]]+).*/\3}"
>>
>> if [[ $match != "$input" ]] ; then
>>       printf 'match is %q\n' "$match"
>> else
>>       print -u2 'no match found.'
>> fi
>> -- snip --
>>
>> The core in this example is the line...
>> -- snip --
>> ${input/~(Elr-g).*([^[:space:]]*ramdisk[^[:space:]]*)([[:space:]]+)([^[:space:]])([[:space:]]+).*/\3}
>> -- snip --
>> It grabs the value of variable "input" and returns the content which
>> matches the extended regular pattern (that does the ~(Elr-g) specify:
>> Extended regular pattern ("E") with left ("l") and right ("r")anchors
>> and greedy matching ("-g", the greedy mode matches the shortest
>> pattern, the default for regular expressions is to match the longest
>> character sequence)) in the 3rd bracket pair. If no match is found the
>> full value of variable "input" is returned.
>>
>> Notes:
>> 1.I made the example a bit more verbose, AFAIK the [:space:] can be
>> replaced with a plain white space assuming /etc/mnttab doesn't use
>> both SPACE and TAB in the same file.
>> 2. [^ ] means: This pattern matches a single character which is not a
>> space (^ means "not")
>> 3. * matches zero or more characters and + matches one or more characters
>> ----
> [snip]
>> This info is good to know.  However, for this particular example, I think it
>> is clearer to use nawk just because it will be shorter.  Alex helped me with
>> this already, and it works:
>
> Erm... I doubt it is shorter because you run a seperate process which
> shuffels around a few MB during loading&&starting. It only _looks_
> shorter (but you are right, for those who don't do regex pattern stuff
> often the solution using "awk" looks easier (but IMO at an expense of
> being an overkill. IMHO heavywheight filters like sed/awk/tr/etc.
> should only be used if there are more data to process than at least
> 1MB. It's IMO not efficient to move around flies using elephants...)).
>
>> /usr/bin/nawk '$1 ~ /ramdisk/ {if ($2 ~ /^\/$/) print $2}' \
>> </etc/mnttab
>>
>> However, I am running into a problem when I try to do something similar, but
>> where I pass the match-string in as a variable:
>>
>> VARPKG=/var/pkg
>> varpkg_fstype=($/usr/bin/nawk \
>>     '{if ($2 == $VARPKG) print $3}' </etc/mnttab
>>
>> Problem is that $VARPKG is not getting interpretted into /var/pkg before
>> getting passed to nawk.
>
> You use '...' to pass the awk program and anything within '...' is
> passed as plain literal to awk. If you want that $ gets interpreted by
> the shell then you must use "..."-style string literals.

Erm... I forgot something. If you use some kind of parameters in "awk"
scripts it is recommended to pass them as _arguments_ and extract the
values using ARGV[i]. See nawk(1). Otherwise you may hit some
interesting issues with quoting when your parameter value contains
characters which may be interpretable as "awk" program fragment.

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) [email protected]
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)
_______________________________________________
caiman-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/caiman-discuss

Reply via email to