[clug] Shell scripting problem using 'process substitution' [ >( pipeline ) ]

George at Clug Clug at goproject.info
Wed Nov 11 22:42:03 UTC 2015


    Steve,

Have you thought about rsync'ing the wget page individually each time
you get the page, and then on the "other machine", concatenating the
page with a file containing all the other pages ? 

Would my suggestion be easier to implement and still supply the end
product that you require?

I agree with you, I would not want to rsync the same data over and
over again. Though I was my understanding that rsync should only copy
over the new data, though I don't know how much data transfer there
would be for rsync to determine if the whole file had changed or not.

Maybe I have not grasp exactly what you want to achieve?

George.

At Thursday, 12-11-2015 on 09:12 steve jenkin wrote:


Following a line problem, I have a monitoring script running on a
low-power Linux box that uses wget to get the stats page from my
(ADSL) Netcomm router/firewall.
The script runs continuously and I rsync the file back to another
machine.
"Just because", the monitoring script only ever appends to the file,
so it gets large.

Looking at the data, I could break the file into “per day” files,
and then analyse them.
It’s easier admin to leave everything in the one file and just
select the day/s I want to process.
[Manually stop / start the monitor & break-out the days into their own
files. Can’t do this solely on the destination m/c because of
‘rsync’.]

I found myself running the same grep (for the day) twice over the long
file & counting different things, and wondered if there was a way to
use a pipeline. There is no performance reason to do this - doesn’t
take much time, it’s “just because” :)
[A problem I had encountered for work a few times and never came up
with a solution I liked.]

I’ve got two variants below that work, but I’m not happy with the
result…
To see something useful, the ">( process )” have to write to STDERR
(or /dev/tty).

If I pipe the output of the ‘inner’ count to STDOUT, then it gets
sucked up by the next step in the main pipeline and I won’t see it.

I _could_ play with file descriptors (clone STDOUT to FD-3 for
‘inner processes' and STDOUT of last process to /dev/null at the
end), but that seems a bit clumsy.

The fragment as it is now can’t be ‘just used’ in a pipeline
because it doesn’t output to STDOUT [throws it away], but STDERR.

Anyone do anything like this?

Any suggestions?

Thanks in Advance

steve


Using two outputs to STDERR
> for i in {10..12}
> do d=15-11-${i}; echo $d
>    grep "$d" netcomm-link-SNR | tee >( (echo 'tot: ' `wc -l`)
>&2 ) >( (echo 'drops: ' `grep '0$'|wc -l`) >&2 )|cat >/dev/null
> done

variant: one output to STDERR
> grep "$d" netcomm-link-SNR|tee >( (echo 'tot: ' `wc -l`) >&2 )
|(echo 'drops: ' `grep '0$'|wc -l`)


File Descriptor Fiddling. Haven’t tried this properly… Has the
problem of connecting to later process with a pipe.
the last /dev/null creates a problem.
> exec 3>&1

> grep "$d" netcomm-link-SNR | tee >( (echo 'tot: ' `wc -l`) >&3 ) >(
(echo 'drops: ' `grep '0$'|wc -l`) >&3 )|cat >/dev/null



--
Steve Jenkin, IT Systems and Design 
0412 786 915 (+61 412 786 915)
PO Box 48, Kippax ACT 2615, AUSTRALIA

mailto:sjenkin at canb.auug.org.au http://members.tip.net.au/~sjenkin


-- 
linux mailing list
linux at lists.samba.org
https://lists.samba.org/mailman/listinfo/linux




More information about the linux mailing list