剪切命令的输出

时间:2013-09-12 09:14:43

标签: linux bash grep cut

我有以下命令“xm list”的输出:

Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   505     4     r-----  11967.2
test1                                       28  1024     1     -b----    137.9
test2                                       33  1024     1     -b----      3.2

我用:./ myscript test2执行一个shellcript 在这个脚本中,我需要test2的ID(显示在命令“xm list”(ID33)) 我用grep尝试了它并且像这样切割:

xm list | grep $1 | cut ???

这是如何运作的?

4 个答案:

答案 0 :(得分:4)

使用awk怎么样?

xm list | awk '/^test2/ {print $2}'

我在^中添加了/^test/,以便在该行的开头检查此文本。 awk '$1=="test2" {print $2}'也会成功。

测试

$ cat a
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   505     4     r-----  11967.2
test1                                       28  1024     1     -b----    137.9
test2                                       33  1024     1     -b----      3.2
$ awk '/^test2/ {print $2}' a
33

答案 1 :(得分:4)

使用cut,您无法将多个连续分隔符视为一个,因此cut -d ' '将无效。

在其他答案中使用awk,或在使用tr之前使用cut“挤压”空格:

xm list | grep test2 | tr -s ' ' | cut -d ' ' -f2

答案 2 :(得分:2)

http://linux.die.net/man/1/xm

xm <subcommand> [args]
  

domid 域名

     

使用xend将域名转换为域ID   内部映射。

您是否尝试过xm domid test2

答案 3 :(得分:0)

这不起作用:

可以使用grep:

完成
xm list | grep -P -o '(?<=^([^ ]+ ){3}).*$'

手机上的Grep不知道-P标志,所以我现在无法测试,但这应该可行。

但这完美无缺:

好的,以前的代码不起作用,是的。我也试图获得第4列而不是第2列 但是,我仍坚持认为可以使用grep完成!

xm list | grep -P -o '^test2\s+\K[^ ]+'

此代码已经过测试,可以正常使用:) 这里的要点是\K将重置先前匹配的文本。