仅捕获命令输出的一部分

luc*_*ton 7 command-line bash scripts

如果我要输入某个命令,它会在终端中给我一个很长的输出。我只需要这个输出的几个字符。我如何在 bash 脚本中仅将终端输出中的某些字符保存为变量?

例如,如果我的脚本是:

#!/bin/bash

ifconfig
Run Code Online (Sandbox Code Playgroud)

我可以使用将整个输出保存为变量

OUTPUT="$(ifconfig)"
Run Code Online (Sandbox Code Playgroud)

但我只想复制我的 IP 地址,这是在 inet [IP ADDRESS]

我该怎么做呢?

编辑:IP 地址仅在此处用作示例,因为出于安全原因,我无法在此处提及该命令,它实际上是其他文本中的“短语:[五位数]”,而我只需要该五位数。抱歉有任何混淆

Joh*_*024 10

使用 grep

ifconfig | grep -oP '(?<=inet addr:)[\d.]+'
Run Code Online (Sandbox Code Playgroud)

这使用 grep 的 Perl 样式的正则表达式来选择字符串后面的 IP 地址inet

因此,要将其保存在变量中,只需将两个命令放入$()

output=$(ifconfig | grep -oP '(?<=inet addr:)[\d.]+')
Run Code Online (Sandbox Code Playgroud)

以上将保存系统上所有活动接口的 IP 地址。如果您只想保存一个接口的输出,例如eth0,请使用:

output=$(ifconfig eth0 | grep -oP '(?<=inet addr:)[\d.]+')
Run Code Online (Sandbox Code Playgroud)

使用 awk

ifconfig eth0 | awk -F'[ :]+' '/inet /{print $3}'
Run Code Online (Sandbox Code Playgroud)

/inet /选择包含inet. 在这些行上,打印第三个字段,其中字段分隔符是空格或冒号的 y 组合。

使用 sed

ifconfig eth0 | sed -En 's/.*inet addr:([[:digit:].]+).*/\1/p'
Run Code Online (Sandbox Code Playgroud)

备用 ifconfig

还有另一个版本,ifconfig它产生的输出类似于inet 1.2.3.4而不是inet addr:1.2.3.4. 对于该版本,请尝试:

ifconfig | grep -oP '(?<=inet )[\d.]+'
Run Code Online (Sandbox Code Playgroud)

或者:

ifconfig eth0 | awk '/inet /{print $2}'
Run Code Online (Sandbox Code Playgroud)

或者,使用以下任一版本的 sed 命令ifconfig

ifconfig eth0 | sed -En 's/.*inet (addr:)?([[:digit:].]+).*/\2/p'
Run Code Online (Sandbox Code Playgroud)


小智 5

ifconfig 将来可能会消失,它在某些 linux 中已被弃用(也许是某些 ubuntu 版本,但请继续阅读)。

iproute2 包中的 ip (应该默认安装)给出

ip addr list
Run Code Online (Sandbox Code Playgroud)

并可以缩写为

ip a
Run Code Online (Sandbox Code Playgroud)

并结合

ip a | grep -o -P '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(?=/)'
Run Code Online (Sandbox Code Playgroud)

使用以下 CIDR 掩码斜杠过滤所有 IPv4 相似号码。如果您不介意广播,它甚至可以在 grep 的 -E 模式下工作,只需将 RegEx 的最后一个括号去掉即可。

如果您通常想要剪切 cli 输出,并且想要避免通过 cut 进行管道传输...(就像在本例中获取第一个字段)

IPS=$(ip a | grep -o -E '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | cut -d\  -f1 - )
Run Code Online (Sandbox Code Playgroud)

您可以使用 bash 字符串操作(如下例所示):

echo ${SSH_CONNECTION%% *}
Run Code Online (Sandbox Code Playgroud)

这应该会给您一些从哪里开始以及如何开始的线索。