截取命令的输出结果

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

我使用./myscript test2执行一个shell脚本。 在这个脚本中,我需要test2的ID(在命令“xm list”中显示为ID33)。 我尝试使用grep和cut来实现:

xm list | grep $1 | cut ???

这是怎么运作的呢?
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

4

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

可以采用另一个答案中提到的方法,使用awk命令;或者在使用cut命令前使用tr命令来“挤压”空格:

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

我会在 test2 中添加 ^,以便清楚地检查行首。 - fedorqui

2

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

xm <subcommand> [args]

domid 域名

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

您尝试过xm domid test2吗?


好的,我不知道那个参数哈哈。那是更简单的方法 :D - Vince

0

这样行不通:

只需要用grep就可以完成:

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

我的手机上的Grep命令不支持-P标志,所以我现在无法测试它,但这应该可以工作。

但这个完美地工作:

好吧,之前的代码不起作用,是的。而且我试图获取第四列而不是第二列。
但是,我仍然坚持认为可以用grep来实现!

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

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


我遇到了问题:“grep: lookbehind assertion is not fixed length”。 - fedorqui
@aleks-daniel-jakimenko 你是如何在手机上拥有grep的? - dogbane
@fedorqui 是的,你说得对。在这种情况下使用环视断言是错误的,但我已经用另一种“grep”解决方案编辑了我的答案 :) - Aleks-Daniel Jakimenko-A.
@dogbane N900运行Maemo操作系统。grep作为busybox的一部分默认安装。 - Aleks-Daniel Jakimenko-A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接