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

时间:2014-08-04 10:21:22

标签: linux bash

正如标题所说,我如何在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 个答案:

答案 0 :(得分:2)

你可以尝试下面的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 :(得分:0)

在纯粹的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

答案 2 :(得分:0)

如果你想要包含“php”的所有行都这样做:

 $ php -v | grep -i "php"

然后据说你想要那些你可以添加另一个管道的前三个单词@Avinash建议:

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

答案 3 :(得分:0)

  

一种经典的"万种皮肤猫的方式"问题..

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

(括号在我的所有平台上都显得一致,所以我使用了以下内容:

EG:关于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

....或者在centos / redhat / scientificic linux发行版上:

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