我有一个包含 200 多个绑定扩展文件的列表,其中包含精确的子域信息。
示例模式如下所示。
# /named_ext/db.mysite.com
subdomain A 200.201.202.203
我需要将整条线替换为一组三条不同的线,就像这样。
subdomain A 200.201.202.204
subdomain A 200.201.202.205
subdomain A 200.201.202.206
知道如何在所有/named_ext/
文件下执行这种替换吗?
答案1
您可以使用以下 perl 脚本通过三个恒定 ip(函数)或三个增量 ip(函数)exchange_ips.pl
来交换 ip 。只需在脚本末尾不需要的函数调用前面添加注释 ( )。exchange_const()
exchange_incr()
#
请注意,如果原始 IP 以253
或更高结尾,则一个或多个增量 IP 将不正确。
该脚本修改以 开头的所有行$domainname
。如果域名无关紧要或者文件仅包含一个/同一个域的行,则设置my $domainname = ".+";
。
/usr/bin/perl 的 #! 使用严格; 使用警告; 我的@data = <STDIN>; 我的$domainname =“子域名”; 我的$const_ip1 = “123.123.123.123”; 我的$const_ip2 = “124.124.124.124”; 我的$const_ip3 = “125.125.125.125”; 我的$pattern = qr/^($domainname\s+A\s+)([\d\.]+)/is; 子交换常数($){ 我的 $dataref = shift; 我的$found = 0; foreach (@$dataref) { 如果 ($_ =~ m/$pattern/) { 除非 ($found) { $找到= 1; printf "%s%s\n%s%s\n%s%s\n", $1,$const_ip1,$1,$const_ip2,$1,$const_ip3; } } 别的 { 打印$_; } } } 子 exchange_incr($) { 我的 $dataref = shift; 我的$found = 0; foreach (@$dataref) { 如果 ($_ =~ m/$pattern/) { 除非 ($found) { $找到= 1; 我的 $const = $1; 我的@iparr = 拆分/\./, $2; 对于(1 .. 3){ $iparr[3]++; printf "%s%s\n", $const, join ".", @iparr; } } } 别的 { 打印$_; } } } # 使用固定 IP 来交换 IP 交换常量(\@数据); # 使用增量 IP 交换 IP exchange_incr(\@data);
像这样调用脚本:
perl exchange_ips.pl < your_file
循环遍历所有文件(带备份):
for f in /named_ext/*; do rename s/$/.bak/ $f; perl exchange_ips.pl < $f.bak > $f; done
例子:
要修改的示例文件:
# 一些 foo 子域名 A 200.201.202.203 # 复制 子域名 A 200.201.202.203 # 一些酒吧 其他域名 A 99.99.99.99 其他域 A 1.1.1.1 # 另一个重复项 子域名 A 200.201.202.203
输出exchange_const()
:
# 一些 foo 子域名 A 123.123.123.123 子域名 A 124.124.124.124 子域名 A 125.125.125.125 # 复制 # 一些酒吧 其他域名 A 99.99.99.99 其他域 A 1.1.1.1 # 另一个重复项
输出exchange_incr()
:
# 一些 foo 子域名 A 200.201.202.204 子域名 A 200.201.202.205 子域名 A 200.201.202.206 # 复制 # 一些酒吧 其他域名 A 99.99.99.99 其他域 A 1.1.1.1 # 另一个重复项
答案2
小型 Bash 脚本
您可以使用sed
对每个文件执行的简单命令来执行此操作:
for f in ./named_ext/* ; do
sed -r -i 's/subdomain[ ]+A[ ]+200.201.202.203/subdomain A 200.201.202.204\nsubdomain A 200.201.202.205\nsubdomain A 200.201.202.206/g' $f
done
解释
for 循环枚举并使用文件./named_ext/*
运行该行。将扩展正则表达式并将就地编辑文件。sed
$f
-r
-i
正则表达式替换
subdomain A 200.201.202.203
任意数量的空格
subdomain A 200.201.202.204
subdomain A 200.201.202.205
subdomain A 200.201.202.206
如果要保留间距,可以在行中添加空格sed
。
答案3
#!/bin/bash
tempFile=tempFile
for f in /named_ext/* ; do
awk '
BEGIN {FS = OFS = "."}
/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ {
for (i=0; i<3; i++) {
$4++
print $0
}
}' $f > $tempFile
mv $tempFile $f
done