【发布时间】:2021-08-12 23:14:20
【问题描述】:
我有以下文件
more /etc/hosts
23.1.22.162 kafka01.dfg.com
23.1.22.155 kafka02.dfg.com
23.1.22.222 kafka03.dfg.com
23.1.22.111 master01.dfg.com
23.1.22.239 master02.dfg.com
23.1.22.170 master03.dfg.com
23.1.22.167 worker01.dfg.com
23.1.22.165 worker02.dfg.com
23.1.22.112 worker03.dfg.com
我们想在kafka_name="" 和egrep 时捕获所有master 和worker 机器,所以我们这样做了
kafka_name=""
egrep "\smaster|\sworker|\s$kafka_name" /etc/hosts
但我们仍然得到包含 kafka 机器的主机
egrep "\smaster|\sworker|\s$kafka_name" /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
23.1.22.162 kafka01.dfg.com
23.1.22.155 kafka02.dfg.com
23.1.22.222 kafka03.dfg.com
23.1.22.111 master01.dfg.com
23.1.22.239 master02.dfg.com
23.1.22.170 master03.dfg.com
23.1.22.167 worker01.dfg.com
23.1.22.165 worker02.dfg.com
23.1.22.112 worker03.dfg.com
不管怎样,当我们设置时
kafka_name="kafka"
我们也得到了 kafka 机器
egrep "\smaster|\sworker|\s$kafka_name" /etc/hosts
23.1.22.162 kafka01.dfg.com
23.1.22.155 kafka02.dfg.com
23.1.22.222 kafka03.dfg.com
23.1.22.111 master01.dfg.com
23.1.22.239 master02.dfg.com
23.1.22.170 master03.dfg.com
23.1.22.167 worker01.dfg.com
23.1.22.165 worker02.dfg.com
23.1.22.112 worker03.dfg.com
那么为什么我们设置
kafka_name=""
尽管$kafka_name 为空,它是否仍会从主机打印 kafka 机器?
【问题讨论】:
-
当
$kafka_name为空时,您匹配的是一个空字符串,它匹配所有内容。 -
\s如果它的意思是[[:space:]]是 PCRE 语法,而不是 ERE 语法。egrep根本不保证兑现它(某些版本可以,但标准不需要它)。 -
一种解决方案是设置
kafka_name="periodontic-manipulation"或您确信不会出现在主机文件中的任何其他值。那么该替代方案将永远不会匹配任何东西,而不是匹配所有东西。一种更优雅的方式可能是egrep "\smaster|\sworker${kafka_name:+|\s}$kafka_name" /etc/hosts,它仅在$kafka_name非空时添加|\s。 -
或者完全放弃
grep,使用awk;awk -v kafka_name="$kafka_name" '$2 == "master" || $2 == "worker" || $2 == kafka_name' -
请注意,POSIX 仅指定
grep。使用grep -E获得egrep的功能(和grep -F获得fgrep的功能):此 grep 已以向上兼容的方式进行了增强,以提供历史记录的确切功能 egrep 和 fgrep 命令也是如此。 … _旧的 egrep 和 fgrep 命令可能会在未来很多年作为实现扩展得到支持,允许历史应用程序在不修改的情况下运行。