Bash grep文件用于字符串,并在另一个命令中将每个用作变量

时间:2016-08-08 13:51:14

标签: bash grep cat

在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主机将脱机。

2 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是将所有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,某些命令可能无法运行。

答案 1 :(得分:0)

谢谢Andrii L.我已将您的解决方案改进为:

 $(document).ready(function() {
var calendar = $('#calendar').fullCalendar({
    defaultView: 'agendaWeek',
    events: {
        url: 'json-events-feed.php',
        type: 'POST', // Send post data
        error: function() {
            alert('There was an error while fetching events.');
        }
    }
});
});

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