On 20/11/14 10:32, Bernhard Voelker wrote:
> On 11/20/2014 07:24 AM, Bradley Dean wrote:
>> Thanks! Piping through ( sed -u 1q && sort ... ) works for me and is
>> less typing than my example workaround.
>
> BTW: Please note that older sed versions might slurp more input than
> needed - even with the -u option - e.g. on SLES11 the subsequent sort
> won't see any input (sed 4.1.5):
>
> $ df | { sed -u 1q && sort -k5,5n; }
> Filesystem 1K-blocks Used Available Use% Mounted on
>
> BTW2: Although "sed -u 1q" should be the ~same as "head -n1", the latter
> also consumes the whole df(1) output (even the latest git version):
>
> $ src/df | { src/head -n1 && src/sort -k5,5n; }
> Filesystem 1K-blocks Used Available Use%
> Mounted on
>
> It's not clear for me from the specification [0] wether head(1) is
> allowed to consume more than specified by the -n option.
> Padraig?
>
> [0]
> http://pubs.opengroup.org/onlinepubs/9699919799/utilities/head.html
Yes that's a bit awkward. sed is able to do this as it consumes 1 byte at a
time.
head -n1 works as expected in this regard when reading from file where it
can seek back to the correct location. However as you see it breaks down
when reading from a pipe.
You could split up the data to achieve this as follows,
though that's a bit awkward and non efficient.
df | tee >(head -n1) >(tail -n+2 | sort -k5,5n) >/dev/null
I suppose we could make `head` responsive to `stdbuf -i0`.
In that case the input buffer size is set to 1.
So we could augment `head` like:
#if HAVE_STDIO_EXT_H
# include <stdio_ext.h>
#endif
...
static bool
unbuffered (FILE const * filep)
{
#if HAVE_STDIO_EXT_H
return __fbufsize(file) == 1;
#else
return false;
#endif
}
...
bufsize = unbuffered (stdin) ? 1 : BUFSIZE;
Oh actually I see fbufmode() in gnulib. It would be best to use that.
I need to check that stdbuf -i0 adjusts things accordingly for that.
cheers,
Pádraig.