bash: shortest way to get n-th column of output

后端 未结 8 1972
春和景丽
春和景丽 2020-11-28 03:29

Let\'s say that during your workday you repeatedly encounter the following form of columnized output from some command in bash (in my case from executing svn st

8条回答
  •  借酒劲吻你
    2020-11-28 04:04

    Because you seem to be unfamiliar with scripts, here is an example.

    #!/bin/sh
    # usage: svn st | x 2 | xargs rm
    col=$1
    shift
    awk -v col="$col" '{print $col}' "${@--}"
    

    If you save this in ~/bin/x and make sure ~/bin is in your PATH (now that is something you can and should put in your .bashrc) you have the shortest possible command for generally extracting column n; x n.

    The script should do proper error checking and bail if invoked with a non-numeric argument or the incorrect number of arguments, etc; but expanding on this bare-bones essential version will be in unit 102.

    Maybe you will want to extend the script to allow a different column delimiter. Awk by default parses input into fields on whitespace; to use a different delimiter, use -F ':' where : is the new delimiter. Implementing this as an option to the script makes it slightly longer, so I'm leaving that as an exercise for the reader.


    Usage

    Given a file file:

    1 2 3
    4 5 6
    

    You can either pass it via stdin (using a useless cat merely as a placeholder for something more useful);

    $ cat file | sh script.sh 2
    2
    5
    

    Or provide it as an argument to the script:

    $ sh script.sh 2 file
    2
    5
    

    Here, sh script.sh is assuming that the script is saved as script.sh in the current directory; if you save it with a more useful name somewhere in your PATH and mark it executable, as in the instructions above, obviously use the useful name instead (and no sh).

提交回复
热议问题