如何使用shell脚本查找和删除下面的行

时间:2013-05-17 07:26:05

标签: linux shell sed

由于恶意攻击,下面的行打印在我的所有php项目页面中。现在我想如何使用shell脚本找到并删除这些行

function_exists('date_default_timezone') ?
  date_default_timezone_set('America/Los_Angeles') : 
    ($_REQUEST['c_id']));

我尝试使用下面的脚本但是我收到了错误。我的意思是说我无法将上述行与sed表示匹配。请帮我纠正这个脚本..

#!/bin/sh
search='^function_exists\(\'date_default_timezone\'\)\ \?\ date_default_timezone_set\(\'America/Los_Angeles\'\)\ \:\  \(\$_REQUEST\[\'c_id\'\]\)\)\;'

for file in `find /root/test1 -name "*.php"`; do grep "$search" $file &> /dev/null if [ $? -ne 0 ]; then echo "Search string not found in $file!" else sed -i '/$search/d' $file

3 个答案:

答案 0 :(得分:1)

尝试sed with:seperators而不是/ since在你的模式中America / La与/ ir冲突添加反斜杠所以它的America / la

答案 1 :(得分:1)

你没有正确地逃避正则表达式。请尝试以下方法:

while IFS= read -r -d '' file; do
    if grep -qF "function_exists('date_default_timezone') ? date_default_timezone_set('America/Los_Angeles') : (\$_REQUEST['c_id']));" "$file"
    then
        sed -i "s|function_exists('date_default_timezone') ? date_default_timezone_set('America/Los_Angeles') : (\$_REQUEST\['c_id'\]));|FOO|g" "$file"
    fi
done < <(find /root/test1 -type f -name "*.php" -print0)

答案 2 :(得分:0)

这可能适合你(GNU sed)

pattern1='function_exists('\''date_default_timezone'\'''
pattern2='.*date_default_timezone_set('\''America\/Los_Angeles'\'') :'
pattern3='.*($_REQUEST\['\''c_id'\''\]));'
sed '/^'"$pattern1"'/{N;N;/^'"$pattern1$pattern2$pattern3"'/d}' file