Re: Editing a piped in stream?
On 07/06/18 09:17, Richard Owlett wrote:
Subject line is poorly phrased.
While working on a problem {solved by a different approach} I had:
ls -l /dev/disk/by-label/ | cut -f 10,12 -d ' ' data.txt
I would then manually edit data.txt by replacing the space character
between the two fields with a tab.
I assume you meant:
ls -l /dev/disk/by-label/ | cut -f 10,12 -d ' ' > data.txt
(It is best to cut and paste from a console session, rather than typing
untested commands and/or output into a post.)
I suspect I should be able to do:
ls -l /dev/disk/by-label/ | cut -f 10,12 -d ' ' | *something* >
prettydata.txt
I searched for examples/tutorials found that it should be conceptually
possible. However the examples I found were processing streams I didn't
understand.
What should I be looking for?
Beware that ls(1) with the -l option can produce output with a variable
number of spaces between fields:
2018-07-06 18:51:53 dpchrist@po ~
$ ls -l /bin/e*
-rwxr-xr-x 1 root root 31464 Feb 22 2017 /bin/echo
-rwxr-xr-x 1 root root 28 Jan 23 2017 /bin/egrep
When you feed that to cut(1) and change the delimiter to a space, the
result is broken (and impossible to fix?) because cut(1) expects exactly
one delimiter between each field:
2018-07-06 18:52:27 dpchrist@po ~
$ ls -l /bin/e* | cut -f 6,7,9 -d ' '
Feb 22 2017
Jan
What you want is a tool that can handle fields delimited by one or more
whitespace characters. Regular expressions come to mind, but RTFM
cut(1) doesn't look promising:
2018-07-06 18:53:45 dpchrist@po ~
$ ls -l /bin/e* | cut -f 6,7,9 -d '\s+'
cut: the delimiter must be a single character
Try 'cut --help' for more information.
Perhaps awk(1) or sed(1) (?).
Perl with the -a (autosplit) and -e (evaluate) options is ideal in this
situation, replacing both cut(1) and "something":
2018-07-06 18:55:29 dpchrist@po ~
$ ls -l /bin/e* | perl -ae 'print join("\t", @F[5,6,7]), "\n"'
Feb 22 2017
Jan 23 2017
Perhaps other people will post solutions in their favorite scripting/
programming language. These give you more power and control than
traditional shell pipelines and command-line tools. You should consider
learning one.
David
Reply to: