SED с переменными, содержащими /

Я не уверен, что происходит, но предполагаю, что столбец% CPU отдельного процесса не говорит вам то, что, по вашему мнению, он говорит вам. Из страницы руководства сверху:

  k: %CPU  --  CPU usage
  The task’s share of the elapsed CPU time since the last screen update,
  expressed as a percentage of total CPU time. 

Допустим, вы обновляетесь каждые 4 секунды. Общее время процессора, затраченное на эти 2 секунды, составляет 6% за эти 4 секунды . Но допустим, в одну из этих секунд он вырвался и использовал 24% процессорного времени. Я не говорю, что это происходит, но может быть.

Я доволен верхним здесь.Я вижу использование ЦП с разбивкой по ЦП и далее по пользователем , sys , красиво , простаивает , подождите ] (по вводу-выводу), обслуживающему аппаратные и программные прерывания (привет, си). Вы, вероятно, также можете найти это в htop . Пока у вас есть 1 процессор, который простаивает не менее 20%, вам не о чем беспокоиться, если только ваш вентилятор не беспокоит вас. Но если вы беспокоитесь, возможно, что происходит,% wait и% hi /% si очень высоки, и в этом случае ни один отдельный процесс не имеет высокой загрузки ЦП, а скорее ядро ​​по какой-то причине очень занято.

0
27.09.2018, 12:55
2 ответа

Окончательное решение состоит в том, чтобы переключиться с sed на Perl, который обрабатывает переменные как объекты первого класса, а не как макросы для расширения, как это делает оболочка.

path=/path/to/scriptdir parameters="para1 para2" perl -i~ -pe \
    's|^replace.*$|$ENV{path}/script $ENV{parameters}|g' -- "$filetochange"
  • -pсчитывает ввод построчно и печатает каждую строку после обработки
  • хэш %ENVсодержит переменные окружения, назначение которых в начале команды делает их экспортируемыми для команды
  • s///(меняйте разделители по своему усмотрению )работает аналогично sed, см. perlop
1
28.01.2020, 02:31

( 1 )Не не используйте для этого переменную PATH. Он имеет особое значение для оболочки. Я выбираю SCRIPTDIRздесь:

SCRIPTDIR="/path/to/scriptdir"
PARAMETERS="para1 para2"
FILETOCHANGE="/foo/bar"

(2 )Вам не нужна косая черта(/)как таковая в команде подстановки sed:s#this#that#или s|this|that|работает так же, как s/this/that/g. Sed просто использует символ сразу после sв качестве разделителя для остальной части командыs(замены ). Вы можете использовать это, чтобы избежать проблемы с косой чертой в вашем шаблоне и строке замены :, когда вы используете, например. |как разделитель косая черта не имеет особого значения для sed.

Итак, это сработает:

sed "s%^replace.*$%$SCRIPTDIR/script $PARAMETERS%g" $FILETOCHANGE
2
28.01.2020, 02:31

Теги

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