我只想显示命令中所有记录的特定列。
示例: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
列的行之间可以有空格。
使用AWK
,CUT
等为所有命令编写通用脚本非常棘手,因为它们在“空间”逻辑上工作。
答案 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