【问题标题】:Show particular column for command [duplicate]显示命令的特定列[重复]
【发布时间】:2019-05-22 15:01:53
【问题描述】:

我只想显示命令中所有记录的特定列。

示例:docker ps 向我显示 10 列中的数据。它可以在列标题之间有空格。我的要求是按某个顺序只获得 2-4 列。

在以表格方式响应的任何命令中是否有直接的方法?

我是 Linux 新手,我在想这是否可行。谢谢。


例如:

$ docker ps
CONTAINER ID  IMAGE   COMMAND     CREATED             NAMES
123           image   "ABC DEF"   10 hours ago        image ABC

在上述场景中,CONTAINER ID 是一个标题列但有空格,而在行中NAMES 列之间可以有空格。

使用AWKCUT 等,为所有命令编写一个通用脚本会比较棘手,因为它们适用于“空格”逻辑。

【问题讨论】:

标签: linux bash shell unix command-line


【解决方案1】:

使用 Perl 的示例输出。 Perl 有基于 0 的索引,所以你必须使用 1..3 表示从 2 到 4

$ ps
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
    14556   11424   14556       6944  cons0     197609 22:10:27 /usr/bin/ps
    11424       1   11424      11424  cons0     197609 22:41:21 /usr/bin/bash
$ ps | perl -F'\s+' -lane ' print "@F[1..3]" '
PID PPID PGID
11208 11424 11208
11424 1 11424
380 11424 11208

如果你不需要标题..那么

$ ps | perl -F'\s+' -lane 'if($.>1) { print "@F[1..3]" } '
6072 11424 6072
11424 1 11424

【讨论】:

    【解决方案2】:

    你可以这样使用awk

    $ ps | awk '{print $2 " " $3 " " $4}'
    TTY TIME CMD
    pts/22 00:00:00 bash
    pts/22 00:00:00 ps
    pts/22 00:00:00 awk
    

    或与column -t 一起获得更具可读性的输出:

    $ ps | awk '{print $2 " " $3 " " $4}' | column -t
    TTY     TIME      CMD
    pts/22  00:00:00  bash
    pts/22  00:00:00  ps
    pts/22  00:00:00  awk
    pts/22  00:00:00  column
    

    正如William Pursellawk下面的评论中指出的那样,命令可以简化:

    $ ps | awk '{print $2, $3, $4}' | column -t
    TTY    TIME      CMD
    pts/9  00:00:00  bash
    pts/9  00:00:00  ps
    pts/9  00:00:00  awk
    pts/9  00:00:00  column
    

    【讨论】:

    • 这会起作用,但是当列标题或数据中有空格时它会失败。 command SR NO DETAIL DATE here awk print 1 将是 SR,print 2 将是 NO
    • 这就是awk 的工作方式,它用空格分隔列。要做你想做的事,你必须使用一些ps 选项来告诉它只显示一些列。发布docker psps --version 的全部输出。
    • 是的,awk 就是这样工作的,那么还有其他方法吗?在这种情况下,ps 选项是 docker 的命令,因此传递列名将不起作用。
    • 写起来可能更干净print $2, $3, $4
    • 谢谢,我更新了答案。
    【解决方案3】:

    将输出传送到 trcut

    docker ps | tr -s " " | cut -d " " -f 2-4
    
    tr 上的

    -s 标志挤压字符,只留下一个“”

    -d on cut 告诉用“”分割字段。

    【讨论】:

    • Docker 实际上有一个过滤器 docker ps --format "table {{.ID}}\t{{.Names}}" 用你想要的任何列替换 ID 或名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2013-08-10
    • 2020-05-24
    • 2013-01-09
    • 2019-04-30
    • 2012-08-18
    相关资源
    最近更新 更多