Разве это не должно быть похожим на это? A является файлом, или B является файлом, затем blabla.
if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]];
then
echo "match"
fi
Проблема здесь, Вы читаете из журнала Apache и пишете в него одновременно. Независимо от того, что Вы добавили к журналу, также возвращается в конвейер через cat
звоните (никакая игра слов предназначенный :)). Это создает противный цикл позитивных откликов, который будет продолжать работать, пока Ваша файловая система не заполняется. Ответ на этот вопрос может быть интересен Вам о том, почему это происходит.
Как необходимо пойти об этом затем? Наивное решение состояло бы в том, чтобы изменить файл на месте как так:
for item in ${!values[@]};do
sed -i "..." "$apacheLog" #cat isn't needed here
done
и не передавайте вывод по каналу нигде: сам сценарий изменит файл на месте. Также см. ответ terdon для того, как сделать sed
звоните только однажды (без цикла), чтобы повысить эффективность.
Проблема с этим подходом, однако, состоит в том, что живой сервер Apache будет, вероятно, регистрировать вещи в файл, поскольку Вы работаете над ним, и странные вещи могут начать происходить. Лучшее решение состояло бы в том, чтобы посмотреть в документации Apache для способов хранить уязвимую информацию из журналов.
Кстати, то, что Вы делаете, даже не санирует журналы: это добавляет санированные строки назад в (все еще испорченный) файл журнала.
В настоящий момент существуют различные улучшения, которые можно сделать. Во-первых, и наименее важный, у Вас есть бесполезное использование кошки. То, что намного более важно, - то, что Вы работаете sed
многократно, каждый из которых распечатает весь файл. Я не действительно уверен, с чем Вы делаете grep
, Вы пытаетесь распечатать только те строки, которые содержат определенную переменную?
Так или иначе один способ сделать вещи лучше состоял бы в том, чтобы работать sed
однажды и имеют его, делают все замены. Что-то как:
replace=""
for item in ${!values[@]}
do
## build the sed line
replace="s/${values[$item]}=[^&\t\n]*/${values[$item]}=***/g;$replace"
done
### run the replacement using sed's -i option so it
### changes the original file
eval sed -i \""$replace"\" $apacheLog