shell 同时获取(grep)一条命令得到的结果中的两个字符串

shell 同时获取(grep)一条命令得到的结果中的两个字符串,第1张

用grep -w精确匹配就可以了

比如需要获取的文件里面包含两行:

19216801

19216801:80

如果用grep匹配19216801的话取得的结果是两行

如果用grep -w来匹配的话只能取得:19216801这一行

eof 中的都是在远程主机上执行的命令,无法用变量赋值的形式将值取回本地。

我想到的一个办法是将结果重定向到文件,然后取文件内容

具体也没有环境测试,可以试试结尾的 eof >result,这样result文件生成在本地。

若不行,则 find -mmin -10 | wc -l >result,然后从远程主机取result文件读内容。

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

通常情况下,在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

保存为testsh文件,然后运行

$bash testsh

结果为:

command(rpm -qa) results are: zlib-127-13el7x86_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-620873-29el7x86_64rpm

fi

执行的结果为:

$ bash testsh

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

command iscsiadm could be used already

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

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

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

修过后执行结果如下

$ bash testsh

testsh: 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 =~ "18" ]]

then

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

else

echo "It is going to install jdk 18 version"

fi

执行结果为:

$ bash testsh

java version "180_73"

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

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

check java version results are:

It is going to install jdk 18 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 2>&1` 这样得到了想要的结果。

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

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

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

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

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

shell "/c xxxx>atxt" '在执行的命令后面加 ">atxt" 把结果输出到atxt

Dim Lstr as String

Open "atxt" For input As #1'读取结果

Do While Not EOF(1)

Line Input #1, Lstr

Text1Text = Text1Text & Lstr & vbcrlf

Loop

Close #1

你不要输出结果,那就将结果重定向至 /dev/null 即可,具体代码就是:

你的命令后面加上 >/dev/null 就不会有输出结果了。举个简单的例子:

ping -c 19216811 这个命令,用于判断到这个IP是否畅通,如果你在后面不加上重定向。

那么每次都会输出结果,也就是你现在的情况。所以下面代码我就在ping的后面加上了重定向

代码,让结果屏蔽,仅获取返回值$?,那屏幕上就不会显示ping的结果了,只会显示下面判断结果,懂了么?

#!/bin/bash

ping -c 2 19216811 >/dev/null

if [ $ -eq 0 ];then

    echo 19216811 is okey!

else

    echo 19216811 is failed!

fi

你想问得是php如何执行shell命令把?

可以用system(),exec(),passthru()这三个函数实现

虽然这三个命令都能执行linux系统的shell命令,但是其实他们是有区别的:

system() 输出并返回最后一行shell结果。

exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。

passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

相同点:都可以获得命令执行的状态码

例子:system("ls -al");

使用之前要在phpini中把safe_mode关闭

Shell中执行的每个命令都会通过退出状态码(exit status)来返回命令的执行结果,它是0~255之间的整数值。

此时你会看到的结果是 0

默认状态下,shell脚本会以脚本中的最后一个命令作为退出状态码。所以一般情况下,在shell脚本中以 exit 命令的值来指定shell命令的退出状态码。但是退出状态码的范围是 0 ~ 255, 退出值超出这个范围将会执行取模运算。例如通过exit 命令指定返回值为300,经过取模运算,那么退出状态码就为44。

ifconfig eth0|grep eth0|awk '{print $5}' |head -1

head命令是取输入的流的头部,可以指定行数

tail命令是取输入的流的尾部

以上就是关于shell 同时获取(grep)一条命令得到的结果中的两个字符串全部的内容,包括:shell 同时获取(grep)一条命令得到的结果中的两个字符串、shell中自定义的函数ssh远程主机执行命令怎么返回结果、如何捕获在C#Shell命令的输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9620907.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存