[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: