grep +如何忽略很多标记的行,行

时间:2014-11-09 13:45:40

标签: linux bash grep solaris

我需要从 / 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

4 个答案:

答案 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)

不需要awktailgrep等链。

或者,只有一个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 - 打印第一行输出。