【问题标题】:Bash grep file for string and use each as a variable in another commandsbash grep 文件中的字符串,并在另一个命令中使用每个作为变量
【发布时间】:2016-08-08 13:51:14
【问题描述】:

在 HA 配置中,我会定期检查 eth0 上的 VIP 地址(我们称之为 2.2.2.2)。如果已经启动,那么我需要在 /etc/network/interfaces 配置文件中调出另一组为 eth0 定义的 IP 地址:

up ip addr add **1.2.3.34** dev $IFACE
up ip addr add **1.2.3.40** dev $IFACE
up ip addr add **1.2.3.48** dev $IFACE

并将每个 IP 仅传递给另一组命令:

ip a a **1.2.3.34/32** dev eth0
ip a a **1.2.3.40/32** dev eth0
ip a a **1.2.3.48/32** dev eth0

到目前为止我所做的是:

#!/bin/bash
STATUS=$(ip a s eth0 | grep inet | awk '{print $2}' | sed 's/addr://')
if ip a s eth0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep 2.2.2.2/27 ; then
cat /etc/network/interfaces | grep -o "up ip addr add [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" |  grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" > /tmp/ext_ip.txt

现在我需要帮助如何将每一行传递给上面提到的另一个命令(ip a a 1.2.3...),但不知道如何正确执行此操作。

如果系统中不存在 VIP,我可以选择恢复操作 - 以防主要 HA 主机脱机。

【问题讨论】:

    标签: bash grep cat


    【解决方案1】:

    实现此目的的一种方法是将所有 IP 地址解析为一个数组并使用for 循环将它们分配给接口:

    #!/bin/bash
    
    IFACE='eth0'
    VIP='192.168.0.1'
    IFACES_FILE='/etc/network/interfaces'
    
    STATUS=$( ip address show "$IFACE" | grep -o "$VIP" )
    
    if [ ! -z "$STATUS" ]; then
        ip_addresses=( $( grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' "$IFACES_FILE" ) ) 
        for ip in "${ip_addresses[@]}"; do
            ip address add "$ip" dev "$IFACE"
        done
    fi
    

    这是一个简化的例子。您可能想要添加更多检查,添加一些日志消息以提供对调试有用的输出。此外,根据您的服务器配置,如果没有sudo,某些命令可能无法运行。

    【讨论】:

      【解决方案2】:

      感谢 Andrii L。我已经改进了您的解决方案:

      #!/bin/bash
      IFACE='eth0'
      VIP='2.2.2.2'
      IFACES_FILE='/etc/network/interfaces'
      
      STATUS=$( ip address show "$IFACE" | grep -o "$VIP" )
      
      if [ ! -z "$STATUS" ]; then
      ip_addresses=( $( grep -o 'up ip addr add [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' "$IFACES_FILE" |  grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' ) )
      for ip in "${ip_addresses[@]}"; do
      ip address add "$ip"/32 dev "$IFACE"
      done
      else
      for ip in "${ip_addresses[@]}"; do
      ip address del "$ip"/32 dev "$IFACE"
      done
      fi
      

      否则它会尝试添加在 /etc/network/interfaces 文件中找到的所有 IP 和广播。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2022-12-02
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多