如何在Linux Bash中获取命令输出的一部分?

7

如何在Bash中获取命令输出的一部分?

例如,命令php -v会输出以下内容:

PHP 5.3.28 (cli) (built: Jun 23 2014 16:25:09)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies with the ionCube PHP Loader v4.6.1, Copyright (c) 2002-2014, by ionCube Ltd.

我只想输出PHP 5.3.28 (cli)这部分内容,请问如何实现?

我尝试过使用php -v | grep 'PHP 5.3.28'命令,但是输出结果为:PHP 5.3.28 (cli) (built: Jun 23 2014 16:25:09),这并不是我想要的。

4个回答

9

你可以尝试下面的 AWK 命令:

$ php -v | awk 'NR==1{print $1,$2,$3}'
PHP 5.3.28 (cli)

它打印输入的第一行的前三列。

  • NR==1(条件)即,仅当 NR 变量的值为 1 时才执行 {} 中的语句。
  • {print $1,$2,$3} 打印 col1、col2 和 col3。在 print 语句中的 , 表示输出字段分隔符(OFS)。

1
它能运行,但我不明白你在做什么。你能解释一下吗? - William
1
哦,等等,我现在明白了! :) 非常感谢! - William

4

在纯Bash中,您可以执行以下操作:

echo 'PHP 5.3.28 (cli) (built: Jun 23 2014 16:25:09)' | cut -d '(' -f 1,2

输出:

PHP 5.3.28 (cli)

或者使用空格作为分隔符:

echo 'PHP 5.3.28 (cli) (built: Jun 23 2014 16:25:09)' | cut -d ' ' -f 1,2,3

1

一个经典的“千万种方法剥皮猫”的问题...

这些方法似乎是通过空格过滤的... 如果版本/注释包含空格,这将失败。

然而,(括号在所有平台上似乎都是一致的,因此我使用了以下方法:

例如,在Debian上:

root@host:~# php -v  | head -1
PHP 5.3.28-1~dotdeb.0 with Suhosin-Patch (cli) (built: Dec 13 2013 01:38:56)
root@host:~# php -v  | head -1 | cut -d " " -f 1-2
PHP 5.3.28-1~dotdeb.0

所以我要删除第二个 ( 之前的所有内容:
root@host:~# php -v  | head -1 | cut -d "(" -f 1-2
PHP 5.3.28-1~dotdeb.0 with Suhosin-Patch (cli)

注意: 结尾可能会有一个空格。

或者,您也可以使用软件包管理器来确定这个(推荐):

root@debian-or-ubuntu-host:~# dpkg -s php5 | grep 'Version'
Version: 5.3.28-1~dotdeb.0

...或在CentOSRed Hat LinuxScientific Linux发行版上:

[root@rpm-based-host ~]# rpm -qa | grep php-5
php-5.4.28-1.el6.remi.x86_64

0
如果你想要所有包含“php”的行,可以这样做:
 $ php -v | grep -i "php"

然后如果你想要这些单词中的前三个单词,你可以像@Avinash建议的那样添加另一个竖杠:

$ php -v | grep -i "php" | awk 'NR==1{print $1,$2,$3}'

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