4

我有以下命令“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

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

xm list | grep $1 | cut ???

这是如何运作的?

4

4 回答 4

5

使用 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
于 2013-09-12T09:15:42.943 回答
4

cut您不能将多个连续的分隔符视为一个,因此将cut -d ' '不起作用。

要么awk在另一个答案中使用,要么tr在使用之前使用“挤压”空格cut

xm list | grep test2 | tr -s ' ' | cut -d ' ' -f2
于 2013-09-12T09:21:35.877 回答
2

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

xm <subcommand> [args]

domid 域名

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

你试过xm domid test2吗?

于 2013-09-12T09:42:10.027 回答
0

这是行不通的:

只需使用 grep 即可完成:

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

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

但这完美地工作:

好的,以前的代码不起作用,是的。我也试图获得第 4 列而不是第 2 列。
但是,我坚持认为它可以做到grep

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

这段代码已经过测试并且可以工作:)
这里的重点是\K重置以前匹配的文本。

于 2013-09-12T09:57:28.067 回答