sed соответствует либо началу строки, либо символу

См. Поиск IP-адреса для Vedran Sego . Я предполагаю, что вы не из Китая, поэтому мой первый шаг — отключить SSH

  1. sudo -i
  2. systmctl disable ssh
  3. systemctl stop ssh

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

.

0
01.12.2020, 03:03
3 ответа

В подобных случаях я обычно обманываю и добавляю :в начале и в конце, поэтому удаляю особые случаи; соответствие теперь всегда для:a=foo:

Так:

sed -e 's/^/:/' -e 's/$/:/' -e 's/.*:di=\([^:]*\):.*/\1/'

Можно оптимизировать

sed -e 's/^\(.*\)$/:\1:/' -e 's/.*:di=\([^:]*\):.*/\1/'

Результаты:

% echo "di=a;b:*.di=c;d:ddi=e;f" | sed -e 's/^/:/' -e 's/$/:/' -e 's/.*:di=\([^:]*\):.*/\1/'
a;b
% echo "ddi=a;b:di=c;d:*.di=e;f" | sed -e 's/^/:/' -e 's/$/:/' -e 's/.*:di=\([^:]*\):.*/\1/'
c;d
echo "*.di=a;b:ddi=c;d:di=e;f" | sed -e 's/^/:/' -e 's/$/:/' -e 's/.*:di=\([^:]*\):.*/\1/'
e;f

Другой чит может состоять в том, чтобы преобразовать :в новую строку, и тогда он всегда соответствует a=fooбез каких-либо:

tr : '\012' | sed -n 's/^di=//p'
1
18.03.2021, 22:46

Кроме того, это можно сделать так, как показано на рисунке. Транслитерировать все двоеточия на новые строки затем, непрерывно отключая ведущую пару KV, пока не появится di=.

{
echo "di=a;b:*.di=c;d:ddi=e;f"
echo "ddi=a;b:di=c;d:*.di=e;f"
echo "*.di=a;b:ddi=c;d:di=e;f"
} \
| sed -n 'y/:/\n/;/^di=/!D;P'

di=a;b
di=c;d
di=e;f
1
18.03.2021, 22:46

Использование awkвместо sedс :и =в качестве разделителей полей, просмотр каждой записи и печать следующего поля, если найдено поле, соответствующееdi:

$ awk -F '[=:]' '{ for (i = 1; i < NF; ++i) if ($i == "di") { print $(i+1); next } }' file
a;b
c;d
e;f

Аналогично, но вместо этого используются :, =и новые строки в качестве разделителей записей:

$ awk -v RS='[=:\n]' '$0 == "di" { getline; print }' file
a;b
c;d
e;f

Это будет работать, только если ваш awkобрабатывает многосимвольное -значение в RSкак регулярное выражение. Этот последний вариант также будет печатать каждое значениеdiв каждой исходной строке, если таких значений больше одного. (первый вариант избегает этого, вызываяnext).

1
18.03.2021, 22:46

Теги

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