Это можно сделать однострочным, но я пишу его как отдельный скрипт, чтобы избежать горизонтальных полос прокрутки в длинной строке поиска.
#! /usr/bin/perl -p -i.bak
# save as fix.pl, and make executable with chmod +x fix.pl
BEGIN {
undef $/;
$srch='/\\*236499a9e0b11c0dc3eecf5cf751a097\\*/';
} ;
s:$srch.*$srch::sgo ;
затем запустите ./ fix.pl зараженный файл.php
Это удалит все, начиная с первого экземпляра * 236499a9e0b11c0dc3eecf5cf751a097 *
до второго экземпляра. Исходный файл будет сохранен как инфицированный файл.php.bak
- вы можете позже отправить их с помощью команды find. -type f -name '* .php.bak' ...
Если вам не нужны файлы .bak
, измените -i.bak
на ] #!
строка просто -i
.
undef $ /;
сообщает perl
, что нужно удалить сразу весь файл.
Модификатор s
в конце регулярного выражения ( / sgo
) указывает perl обрабатывать входные данные как одну строку, причем символы новой строки и т. Д. Рассматриваются так же, как любой другой символ.Модификатор g
делает его глобальным поиском и заменой (в случае, если в файле встречается более одного раза), а модификатор o
сообщает perl, что даже если в регулярном выражении используются переменные, он не будет вообще меняться в течение всего срока действия скрипта, поэтому можно безопасно скомпилировать регулярное выражение только один раз (что значительно ускоряет выполнение).
Чтобы исправить все ваши зараженные файлы .php:
find . -type -f -name '*.php' -exec ./fix.pl {} +
Если вы хотите сравнить объемную группу из выходных данных, может быть проще предварительно -обработать, чем:
# if you still need it
pvs_var=$(pvs | grep "sdb1")
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
echo do something
fi
Чем вы занимались
$($pvs_var | awk '{ print $2 }')
инициировал замену команды $(... )
, первой командой которой была $pvs_var
. Bash послушно подставил значение переменной, а затем попытался выполнить ее. Это не то, что ты хотел.
Другим вариантом может быть отправка переменной в виде строки здесь -команде awk:
#...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
#...
Здесь подстановка команды вызывает awk и передает ему на стандартный ввод --содержимое переменной $pvs_var
.
Вы пытаетесь выполнить содержимое $pvs_var
как команду, а не передать строку в awk.
Чтобы исправить это, добавьте echo
или printf
в оператор if:
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
Можно попробовать только с awk:
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
Получите вывод в формате JSON, и тогда вы сможете извлечь информацию более надежным способом:
pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
printf '%s\n' "$pv_info" |
jq -r '.report[].pv[]|select(.pv_name == "/dev/sdb1").vg_name'
)
if [ "$sdb1_vg" = vg_name ]; then...
Или используйте правильный язык программирования с библиотекой JSON вместо оболочки(ksh93
поддерживает JSON, хотя в следующей версии ).
(вам нужен LVM 2.02.158 (2016 )или новее для--reportformat json
).
Если вы хотите сделать только один запрос,pvs
также может сделать всю работу за вас:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
(вам нужен LVM 2.02.107 (2014 )или новее для-S
).
Также не забудьте указать переменные в кавычках и , избегаяecho
.