如何检查文件中存在的子字符串?

时间:2017-07-25 08:04:48

标签: linux string shell firewall

我想在带有shell脚本的文件中编写一些规则。但在添加任何规则之前,我想检查一些条件。这是我的档案:

示例:

我写了一些规则:

/home/Desktop/myfile.txt

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 666 -j DNAT --to-destination 192.168.19.55
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 633 -j DNAT --to-destination 192.168.19.44
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 656 -j DNAT --to-destination 192.168.19.88

现在如果文件在添加新规则时包含相同的端口和IP,则脚本应该已经存在打印规则。如果只有端口存在于现有文件中,则脚本应该打印已在使用的端口。否则,我想打印成功。

case 1 : if i add 666 port with 192.168.19.55 IP , the script should print rule already exist .
case 2 :  if i add 666 port with 192.168.66.55 IP , the script should print port already used  .
case 3 : otherwise script print success . 

我尝试用参数编写简单的shell脚本作为IP和端口:

#!/bin/shell
if [ $# -eq 2 ] 
then
    //How to check the above conditions with file /home/Desktop/myfile.txt ??
    //Need to add this rule to the myfile.txt 
    iptables -t nat -A PREROUTING -p tcp -m tcp --dport $2 -j DNAT --to-destination $1
else
    echo "invalid arguments"
fi

2 个答案:

答案 0 :(得分:0)

您可以使用grep检查文件的内容。请注意,.在正则表达式中是特殊的,因此我使用参数扩展将其替换为与字面匹配的\.

#!/bin/bash

config=/home/Desktop/myfile.txt

ip=$1
port=$2

if grep -q -- "--dport $port .*--to-destination ${ip//./\\.}$" "$config"; then
    echo Rule already exists. >&2
    exit 1

elif grep -q -- "--dport $port " "$config"; then
    echo Port already used. >&2
    exit 1

else
    echo iptables -t nat -A PREROUTING -p tcp -m tcp --dport $port -j DNAT --to-destination $ip
fi

这只是一个例子。实际上,端口和目标可能在配置文件中以不同的顺序出现,因此表达式会更复杂。从仅包含给定格式(即两列,目标和端口)所需信息的文件生成文件可能更容易。

答案 1 :(得分:0)

awk -v port=$1 -v ip=$2 '($11 == port && $15 == ip) { print "rule already exists"  } ($11 == port && $15 != ip) { print "Port already in use" } ($11 != port && $15 != ip) { print "success";system("iptables -t nat -A PREROUTING -p tcp -m tcp --dport "$2" -j DNAT --to-destination "$1) }' myfile.txt

使用awk,我们可以专注于端口的第11个空格分隔数据和IP地址的第15个数据,并根据传递的端口和IP打印参数检查基于特定条件的所需文本并运行iptables命令成功。