我需要从 / etc / hosts 文件中捕获 machine_VIP (完全匹配)
问题是在hosts文件中有一些带有machine_VIP的行,但是在machine_VIP或行被注释之前它们已经注释了
所以在这种情况下我们需要忽略那些行
meenwhile我编写以下命令以获取与machine_VIP一起存在的IP,但它没有使用正确的IP,因为标记的字符#
Cluster_VIP=` grep -iw machine_VIP /etc/hosts | awk '{print $1}' | head -1 `
示例:(我的主机文件)
5.5.5.5 GH_T T1 T2 T3 # machine_VIP
# 198.2.3.12 MON1 MON2 machine_VIP
18.2.4.12 W1 # machine_VIP # machine_VIP # machine_VIP
192.9.200.77 machine_linux1 machine_linux2 machine_VIP
192.9.200.78 machine_linux10 machine_linux20 machine_VIP_test
请在我的命令中建议我需要添加的内容,以获得正确匹配的IP
根据以下示例,预期结果应为:
echo $Cluster_VIP
192.9.200.77
答案 0 :(得分:3)
您可以使用getent
命令来完成它而不是grep
命令。
[root@myserver ~]# cat /etc/hosts
5.5.5.5 GH_T T1 T2 T3 # machine_VIP
# 198.2.3.12 MON1 MON2 machine_VIP
18.2.4.12 W1 # machine_VIP # machine_VIP # machine_VIP
192.9.200.77 machine_linux1 machine_linux2 machine_VIP
192.9.200.78 machine_linux10 machine_linux20 machine_VIP_test
[root@myserver ~]# Cluster_VIP=$(getent hosts machine_VIP |awk '{print $1}')
[root@myserver ~]# echo $Cluster_VIP
192.9.200.77
答案 1 :(得分:1)
grep -w '^[^#]* machine_VIP' /etc/hosts | head -1 | awk '{print $1}'
这会在其前面搜索machine_VIP
但没有#
的行。
答案 2 :(得分:1)
这个单sed
声明怎么样?
sed -n '/^[^#]*\bmachine_VIP\b/s/[[:space:]].*//p' /etc/hosts
(使用GNU \b
作为单词边界 - 这可以很容易地修改为不使用GNU扩展名。)
或者,既然您正在使用Bash,那么可以使用grep
:
read -r Cluster_VIP _ < <(grep '^[^#]*[[:space:]]machine_VIP\([[:space:]]\|$\)' /etc/hosts)
不需要awk
,tail
,grep
等链。
或者,只有一个awk
:
Cluster_VIP=$(awk '/^[^#]*[[:space:]]machine_VIP([[:space:]]|$)/ {print $1;exit}' /etc/hosts)
现在,纯粹的Bash可能性,以便您确定它将在任何安装Bash的地方运行:
while IFS= read -r line; do
[[ $line =~ ^[^#]*[[:space:]]machine_VIP([[:space:]]|$) ]] || continue
read -r Cluster_VIP <<< "$line"
break
done < /etc/hosts
if [[ $Cluster_VIP ]]; then
echo "$Cluster_VIP"
else
echo >&2 "Cluster VIP not found"
exit 1
fi
答案 3 :(得分:0)
试试这个:
grep -w '^[^#]* machine_VIP' /etc/hosts | head -1 | awk '{print $1}'
第一个grep - 在/ etc / hosts文件中具有相同大小写的machine_VIP的精确字匹配
第二个grep - 忽略包含#
的所有行Awk - 打印IP地址
head - 打印第一行输出。