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://ybzwz.com/article/ddjihdh.html