Как лечить вывод команды в виде текста

Это можно сделать однострочным, но я пишу его как отдельный скрипт, чтобы избежать горизонтальных полос прокрутки в длинной строке поиска.

#! /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 {} +
5
30.11.2018, 17:42
4 ответа

Если вы хотите сравнить объемную группу из выходных данных, может быть проще предварительно -обработать, чем:

# 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.

2
27.01.2020, 20:31

Вы пытаетесь выполнить содержимое $pvs_varкак команду, а не передать строку в awk.

Чтобы исправить это, добавьте echoили printfв оператор if:

if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
    do something
fi
12
27.01.2020, 20:31

Можно попробовать только с awk:

pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
0
27.01.2020, 20:31

Получите вывод в формате 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.

4
27.01.2020, 20:31

Теги

Похожие вопросы