2015-04-07 63 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路徑中(在各種環境中) ,可以很容易地刪除這些額外的代碼 –