我是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。它可行吗?
答案 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