如果我输入某个命令,它会在终端中给我一个很长的输出。我只需要这个输出中的几个字符。如何在 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