【问题标题】:Bash get string valuebash 获取字符串值
【发布时间】:2018-08-19 16:13:20
【问题描述】:

我必须从其配置文件中获取网络设备的主机名。该文件如下所示:

...
hostname=T14Z18
ipaddress=192.168.0.1
...

如何做到这一点?我正在 ssh'ing 进入机器。

【问题讨论】:

  • 顺便说一句,这可能与Reading key/value parameters from a file into a shell script 非常相关——唯一的区别是那里的答案通常读取 whole 文件,而在这里你试图只提取一个项目。如果您打算阅读的不仅仅是几项,那么使用单遍方法可能会更有效,就像那里的答案一样。

标签: bash


【解决方案1】:

像这样使用grepcut

$ grep '^hostname=' configfile  | cut -d= -f2
T14Z18

您也可以将上述内容与ssh 中的ssh 命令结合使用Bash

$ ssh "$(grep '^hostname=' configfile | cut -d= -f2)"

$() 之间的所有内容都将替换为括号内的命令输出,因此与手动键入 ssh T14Z18 相同。 此功能称为command substitutionBash

还要注意你可能使用的OpenSSH 有它自己的配置 存储在~/.ssh/config 中,您可以使用它来创建别名。为了 例如,以下条目创建了一个名为 rpi 的别名:

Host rpi
User pi
Hostname 192.168.1.161

您现在只需执行 ssh rpi 即可找到用户和主机名 由OpenSSH 客户端自动生成。如果您的网络中有DNS 服务器,您当然可以在示例中使用主机名,例如 T14Z18,而不是 IP 地址。

【讨论】:

  • 最好引用:ssh "$(grep '^hostname=' configfile | cut -d= -f2)"——这样,如果你没有准确地说出一个单词,错误消息将是有意义的(而不是将其他单词视为命令的一部分发送到远程机器,或者将第一个后续参数作为主机名传递给 ssh 的 0 字)。
【解决方案2】:

使用简单的awk命令:

awk -F'=' '$1 == "hostname"{ print $2; exit }' configfile

【讨论】:

  • grep | cut效率更高,也有head -n 1的效果,防止多次匹配。
【解决方案3】:

使用- 如果-P 正则表达式 switch 被实施:

grep -oP 'hostname=\K.*' configfile
                   __
                    ^
                    |

重新开始比赛技巧

Support of \K in regex

【讨论】:

  • 应该指定“使用 GNU grep,在编译时使用可选的 PCRE 支持”以更明确地了解可移植性限制。
  • 帖子已编辑。更精确的不是 PCRE,而是 perl 正则表达式
  • PCRE == "Perl 兼容的正则表达式引擎"。在编译时在 libpcre 的 3rd-party 库中使用这样的支持链接编译grep,所以我认为在这里将其描述为“PCRE”是完全合适的。
  • man grep 不是清楚,它说perl regex和PCRE,那不一样
  • grep -P 在代码库中由pcresearch.c 实现。来源见git.savannah.gnu.org/cgit/grep.git/tree/src/pcresearch.c。这是绝对 PCRE。
猜你喜欢
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 2013-02-05
  • 2022-01-06
  • 2020-04-29
  • 2020-02-28
相关资源
最近更新 更多