On Tue, 2005-09-20 at 13:56 +0800, Ow Mun Heng wrote: > Remember my script that sends out HTML emails? Well, that's done, but > it's in-efficient. > > The actual script that parses screen-scrapes. Initial script only went > to get the "Last Price" now, I would like to add the "Day Range" > > last_price() > { > value="$(lynx -dump "$url$symbol" | grep 'Last price:' | \ > awk -F: 'NF > 1 && $(NF) != "N/A" { print $(NF) }' )" > } > > day_range() > { > day_range="$(lynx -dump "$url$symbol" | grep 'Low \& High:' | \ > awk -F: 'NF > 1 && $(NF) != "N/A" { print $(NF) }' )" > } > > The above is in-efficient because I need to call the script to get the > page 2 times. > > Doing a > > lynx -dump "$url$symbol" | egrep -i '(Last Price|Low \& High)'| awk -F: > 'NF > 1 && $(NF) != "N/A" { print $(NF) }' > > will work, but then, there will be 2 values associated with it : > 7.35 > 7.127 - 7.38 > > Can anyone help with a better awk script so that each value will be > associated with each line? > > eg: > last_price=7.35 > day_range=7.127 - 7.38 > > w/o actually piping the lynx output to a file (actually, that would be > the easy way) > > On the other hand, how does one use awk for multigreps like egrep '(pop| > test)' > > I've tried variation of > 1. awk "/Low & High/" > 2. awk "/Low & High/" && /Last/ > 3. awk '{"/Low & High/" && /Last/}' > all of which doesn't work except for No. 1 > > -- > Ow Mun Heng > Gentoo/Linux on DELL D600 1.4Ghz 1.5GB RAM > 98% Microsoft(tm) Free!! > Neuromancer 13:54:21 up 1 day, 4:11, 6 users, load average: 3.66, 2.92, > 2.71 > >
If I understand your question correctly, you're trying to use a single command substitution to assign multiple variables in your bash script from an awk script. In other words, you want to assign multiple variables in the parent process' environment from a child process. There's no direct way that I know of to do this. However, you could do some bash array assignment/awk trickery to assign multiple values into an array like this: declare -a RESULT_A=(`lynx -dump "$url$symbol" | gawk -F: ' BEGIN { IGNORECASE=1 ; } /Last Price/{if (NF>1 && $(NF) != "N/A") { last_price=$NF; next;}} /Low & High/{if (NF>1 && $(NF) != "N/A") { day_range=$NF; next;}} END { printf("[0]=\"%s\" [1]=\"%s\"\n",last_price,day_range); }'`) last_price=${RESULT_A[0]} day_range=${RESULT_A[1]} The BEGIN block assignment gets rid of your egrep -i statement by moving case insensitivity into awk. The middle two lines assign internal vars based on the regex pattern seen. The END block produces output in the form [0]="something" [1]="something else". This gets substituted into the RESULT_A array assignment, which you can then pick apart from bash. HTH Jeff -- gentoo-user@gentoo.org mailing list