2015-04-07 65 views
0

我有三个文件,每个文件中有2259个IP地址的两个文件。一个带有137772的文件。该脚本使用sed与bash阵列和for循环来替换具有不同IP的access.log中的IP。几个小时运行脚本后失败,此错误:sed查找替换使用bash阵列失败

的sed:-e表达式#1,烧焦0:没有以前的正则表达式

uniq的IP地址的数量也短六个IP地址。

下面是脚本:

#!/bin/bash 
_ORGIFS=$IFS 
IFS=$'\n' 
_alIPs=($(<access.log.IPs) 
_fIPs=($(<randomIPs.txt) 
for ((_i=1; _i<=2259; _i++)) 
do 
    sed -i "s/${_alIPs[$_i]}/${_fIPs[$_i]}/g" access.log 
done 
IFS=$_ORGIFS 

回答

2

数组的下标0。当你说

for ((_i=1; _i<=2259; _i++)) 

你忽略的第一个条目,去一个过去的结束,在这一点

sed -i "s/${_alIPs[$_i]}/${_fIPs[$_i]}/g" access.log 

扩展为

sed -i "s//something/g" access.log 

s命令中的//尝试重新使用先前使用的正则表达式,该正则表达式不存在,因此您会收到该错误。

的解决方案是使用

for ((_i=0; _i<2259; _i++)) 

...虽然,说真的,我会花一些时间思考如何做的那些替代散装。

附录:

sed -i -f <(paste access.log.IPs randomIPs.txt | awk '{ print "s/" $1 "/" $2 "/g" }') access.log 

(假设我正确地读你的意图)

+0

或者,只需使用awk而不是sed进程替换。 –

0

根据需要,这是我自己的bash模板LIB使用采取:

# parse a template and return it 
# 1st arg is template tags [array] 
# 2nd arg is replacement values for template tags [array] 
# 3rd arg is template file path 
# usage: TT=$(parseTemplate TAGS[@] REPLACE[@] $MAIL_TEMPLATE); echo $TT; 
function parseTemplate() 
{ 
    local _TAG=("${!1}") 
    local _REPLACE=("${!2}") 
    local _TEMPLATE="${3}" 
    local _PATTERN="" 
    local i 

    if [[ ${#_TAG[@]} > 0 ]]; then 
     _PATTERN="-e s#\%\%${_TAG[0]}\%\%#${_REPLACE[0]}#g" 
     for ((i = 1 ; i < ${#_TAG[@]} ; i++)) 
     do 
      _PATTERN="${_PATTERN}; s#\%\%${_TAG[${i}]}\%\%#${_REPLACE[${i}]}#g" 
     done 

     local SED=`which sed` 
     $SED "${_PATTERN}" < "${_TEMPLATE}" 
    else 
     local CAT=`which cat` 
     $CAT "${_TEMPLATE}" 
    fi 
} 

模板替换标记有这样的格式:%%TAG%%一个可以改变这一状况,但这是此功能使用的功能

示例模板(文件或文本):

在bash开始
Hello %%NAME%%, your location is %%LOCATION%% 


TAGS = ('NAME' 'LOCATION'); 
REPLACE = ('Nikos' 'GR') 
TT=$(parseTemplate TAGS[@] REPLACE[@] $MAIL_TEMPLATE); 
echo $TT; 

http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

+0

''SED ='其中sed'; $ SED ...''没有提供任何优势,只是调用'command sed ...' –

+0

@glennjackman,好吧,这只是照顾一些极端的情况下,命令不在/ bin路径中(在各种环境中) ,可以很容易地删除这些额外的代码 –