如何使用外部文件作为Bash脚本文件的变量源?

时间:2013-09-08 20:19:49

标签: bash file variables external

我是Bash脚本的新手,我需要帮助。

文件 bbb.txt 包含许多 IPv4和IPv6地址,如下所示:

10.0.2.15    fe80...
192.168.1.1   fe80...

文件 aaa.txt 包含许多 iptables命令

我希望我的脚本能够找到aaa.txt中的所有IPv4地址并检查它们是否可以在bbb.txt中找到,匹配时 - aaa.txt中的IPv4将替换为bbb.txt中的IPv6。它可行吗?

2 个答案:

答案 0 :(得分:1)

我认为你最好使用perl

#!/usr/bin/perl

use strict;
use warnings;

my $file1 = 'aaa.txt';
my $file2 = 'bbb.txt';

open my $if1,'<',$file1 or die "$file1: $!\n";
open my $if2,'<',$file2 or die "$file2: $!\n";

my %ip_dictionary;
while(<$if2>){
    my ($ipv4,$ipv6)=split;
    $ip_dictionary{$ipv4}=$ipv6;
}
close $if2;

my $slurp = do { local $/; <$if1>};
close $if1;

$slurp=~ s!((?:[0-9]{1,3}\.){3}[0-9]{1,3})!exists $ip_dictionary{$1} and is_valid_ip($1) ? $ip_dictionary{$1} : $1!eg;

open my $of,'>',$file1;
print $of $slurp;

sub is_valid_ip{
    my $ip=shift//return 0;
    for(split /\./,$ip){
        return 0 if $_ > 255;
    }
    1
}

答案 1 :(得分:0)

将此项保存到文件,例如script.sh

#!/bin/bash
declare -A A
while read -ra __; do
    A[${__[0]}]=${__[1]}
done < "$2"
while read -r __; do
    for I in "${!A[@]}"; do
        [[ $__ == *"$I"* ]] && {
            V=${A[$I}
            __=${__//"$I"/"$V"}
        }
    done
    echo "$__"
done < "$1"

然后运行bash script.sh aaa.txt bbb.txt

要使输出像bash script.sh aaa.txt bbb.txt > out.txt

那样运行

这次我更喜欢使用Bash,因为你必须在Awk中引用非文字。

Ruby的另一个解决方案:

ruby -e 'f = File.open(ARGV[0]).read; File.open(ARGV[1]).readlines.map{|l| l.split}.each{|a| f.gsub!(a[0], a[1])}; puts f' aaa.txt bbb.txt

直接修改文件的另一种方法:

#!/bin/bash
A=$(<"$1")
while read -ra B; do
    A=${A//"${B[0]}"/"${B[1]}"}
done < "$2"
echo "$A" > "$1"

bash script.sh aaa.txt bbb.txt运行。

另一个通过Ruby:

ruby -e 'x = File.read(ARGV[0]); File.open(ARGV[1]).readlines.map{|l| l.split}.each{|a| x.gsub!(a[0], a[1])}; File.write(ARGV[0], x)' aaa.txt bbb.txt