显示命令的特定列

时间:2018-12-22 14:51:31

标签: linux bash shell unix command-line

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

示例: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等为所有命令编写通用脚本非常棘手,因为它们在“空间”逻辑上工作。

3 个答案:

答案 0 :(得分:3)

将输出管道传输到 tr 剪切

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

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

-d 剪切指示用“”分隔字段。

答案 1 :(得分: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

awk命令下面的注释中William Pursell可以简化:

$ 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

答案 2 :(得分: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