我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

linux捕获命令输出 linux shell 捕获异常

Linux xargs grep zgrep命令

xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具,它能够捕获一个命令的输出,然后传递给另外一个命令。之所以会用到这个命令,关键是由于 很多命令不支持管道来传递参数 ,而日常工作中就有这个需要,所以就有了 xargs 命令。

站在用户的角度思考问题,与客户深入沟通,找到太谷网站设计与太谷网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、网站建设、企业官网、英文网站、手机端网站、网站推广、域名申请、网络空间、企业邮箱。业务覆盖太谷地区。

我们经常会用grep命令在文件中查找需要的内容,比如现在一个文件夹里面有9个文件,有三种格式txt, csv和gz压缩文件。

123里面存的内容都一样为

456里面存的内容也一样为

789里面存的都是

如果我现在要从所有的文件里面找“apple”

我会得到下面的结果,你会发现 grep不能从gz文件中查找内容

zgrep 这个命令可以解决这个问题,这样就不需要先解压然后再去查找了

会得到如下结果,显示了所有文件格式中找到的“apple”,并且显示了匹配的行号

如果只想在符合某种特征的文件中找你感兴趣的内容呢?比如在文件名中包含123的文件中查找“apple”。这时候就需要管道了,你需要先找到这样的文件然后再从中找“apple”

第一步找到名字中包含123的文件

会得到文件名中包含123的所有文件

第二步查找“apple”

然后我们再来从中找“apple”,你会发现下面这条命令不work,你啥都得不到

这就是我们开篇提到的, 很多命令不支持管道来传递参数。 这个时候 xargs 就派上用场了

同时用上 zgrep ,这样gz文件也一起找了

那么,如果我们想从某一种特定格式的文件中(比如csv文件)找特定的内容该怎么做呢?大家应该能触类旁通,举一反三了吧!

Linux xargs grep zgrep命令

linux下怎么调用命令并获取输出结果和返回值

因为有shell pipe。看这个例子: String[] cmd = {"/bin/sh","-c","ls /etc | grep release"};Process p = Runtime.getRuntime().exec(cmd);

如何捕获在C#Shell命令的输出

这个主要介绍的方法是获取命令的输出内容,而不是命令执行成功与否的返回值。

通常情况下,在shell脚本中需要获取命令的输出内容,然后根据输出内容判断下一步的执行操作。

比较常用的一种方式就是, 匹配命令输出的内容中是否存在某些关键字,选择执行的不同动作。

比较常用的一种方式就是采用反向单引号的方式 -- 保存结果的变量名=`需要执行的linux命令`

这种方式在使用时,有些细节的地方需要注意。 先用几个例子来说明一下。

比如在CentOS7环境中,使用rpm -qa命令查询某些rpm包是否安装,没有安装的话进行安装操作。

举个简单的例子来说:

#!/bin/bash

check_results=`rpm -qa | grep "zlib"`

echo "command(rpm -qa) results are: $check_results"

if [[ $check_results =~ "zlib" ]]

then

echo "package zlib has already installed. "

else

echo "This is going to install package zlib"

fi

保存为test.sh文件,然后运行

$bash test.sh

结果为:

command(rpm -qa) results are: zlib-1.2.7-13.el7.x86_64

package zlib has already installed.

这个脚本基本上是可以工作的。

那么,我们同样使用类似的方式来检查iscsi-initiator软件包是否安装。 与上一个命令不同的是,这个命令是否安装不能通过rpm -qa命令获取。

我们采取另一种方式

#!/bin/bash

check_results=`iscsiadm --version | grep iscsiadm`

echo "check command(iscsiadm) available results are: $check_results"

if [[ $check_results =~ "iscsiadm" ]]

then

echo "command iscsiadm could be used already."

else

echo "command iscsiadm can't be used. Install it"

rpm -ivh iscsi-initiator-utils-6.2.0.873-29.el7.x86_64.rpm

fi

执行的结果为:

$ bash test.sh

check command(iscsiadm) available results are: iscsiadm version 6.2.0.873-28

command iscsiadm could be used already.

这时候看起来脚本是工作正常的,显示iscsiadm已经可用。那么假如一开始的时候iscsiadm命令不可用呢?

我们可以将上面的check_results=`iscsiadm --version | grep iscsiadm`改成为check_results=`iscsiadmm --version | grep iscsiadm`

这样我们故意将命令写错,模拟命令没有安装的情况下脚本的运行。

修过后执行结果如下

$ bash test.sh

test.sh: line 2: iscsiadmm: command not found

check command(iscsiadm) available results are:

command iscsiadm can't be used. Install it

看起来好像也是工作正常的,但是为什么check_results的内容为空呢? 难道不应该将“command not found: iscsiadmm”内容赋值给check_results,然后打印显示出来吗?

我们将iscsiadmm --version | grep iscsiadm单独在命令行中执行,也是有输出的啊,为什么不能赋值成功呢?

这个时候如果我们在命令执行完毕之后,执行命令echo$? 这个时候得到的值为127(Centos7系统)。在命令行中单独执行scsiadm --version | grep iscsiadm命令之后,执行echo $?得到的值为0(Centos7系统)

从这里可以看出在使用··(2个反向单引号)的方式获取执行结果时需要保证单引号内的命令是可以执行成功的。

就算是这样就能保证我们可以获取到想要的内容吗? 不一定,再来看个例子。

#!/bin/bash

check_results=`java -version`

echo "check java version results are: $check_results"

if [[ $check_results =~ "1.8." ]]

then

echo "java version is 1.8, it seems not need to install java again."

else

echo "It is going to install jdk 1.8 version"

fi

执行结果为:

$ bash test.sh

java version "1.8.0_73"

Java(TM) SE Runtime Environment (build 1.8.0_73-b02)

Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)

check java version results are:

It is going to install jdk 1.8 version

怎么回事?命令jdk已经安装了,为什么还是没有匹配到呢?根据第二个例子,我们手动执行命令 java -version 然后执行命令$? 得到的结果为0, 说明命令是执行成功的。怎么还是没有获取到命令的输出呢?

这个现象出现的原因是有可能命令的执行结果被重定向了。

试着将check_results=`java -version` 改成check_results=`java -version 1 /dev/stdout` 和 check_results=`java -version 2 /dev/sdtout` 看看输出是否有变化

为了防止这种情况的发生,最终我们将上面改成check_results=`java -version 21` 这样得到了想要的结果。

使用 保存结果的变量名=`需要执行的linux命令` 这种方式来获取命令的输出时,注意的情况总结如下:

1)保证反单引号内的命令执行时成功的,也就是所命令执行后$?的输出必须是0,否则获取不到命令的输出

2)即便是命令的返回值是0,也需要保证结果是通过标准输出来输出的,而不是标准错误输出,否则需要重定向

因此我们推荐使用 保存结果的变量名=`需要执行的linux命令 21 `的方式来获取命令的执行结果。

感兴趣的朋友可以试下第二个例子中改成 check_results=`iscsiadmm --version 21`的结果。


网页名称:linux捕获命令输出 linux shell 捕获异常
地址分享:http://mswzjz.cn/article/ddjihdh.html

其他资讯