仅捕获命令输出的一部分

仅捕获命令输出的一部分

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

例如,如果我的脚本是:

#!/bin/bash

ifconfig

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

OUTPUT="$(ifconfig)"

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

我该如何做这件事?

编辑:IP 地址在这里仅用作示例,因为出于安全原因,我无法在此处提及命令,它实际上是其他文本中的“短语:[五位数字]”,我只需要那个五位数字。如有混淆,敬请谅解

答案1

使用grep

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

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

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

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

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

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

使用awk

ifconfig eth0 | awk -F'[ :]+' '/inet /{print $3}'

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

使用sed

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

备用ifconfig

还有另一个版本,ifconfig其输出类似于 ,inet 1.2.3.4而不是inet addr:1.2.3.4。对于该版本,请尝试:

ifconfig | grep -oP '(?<=inet )[\d.]+'

或者:

ifconfig eth0 | awk '/inet /{print $2}'

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

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

答案2

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

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

ip addr list

可以缩写为

ip a

并结合

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

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

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

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

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

echo ${SSH_CONNECTION%% *}

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

答案3

使用 Grep 打印 IP 地址(无论接口是什么)的简单方法;因为这就是问题所在

ifconfig |grep -o -P '(?<=addr:).*(?= Bcast:)'

addr:是起始字符串

Bcast 是结束字符串

这两个字符串之间的任何内容都会使用 .* 打印

答案4

使用facter

facter ipaddress

相关内容