Возвратите только часть строки после шаблона соответствия

hi время, проведенное, обрабатывая аппаратные прерывания. Аппаратные прерывания сгенерированы устройствами (сетевые платы, контроллер клавиатуры, внешний таймер, аппаратные датчики...), когда они должны предупредить о чем-то ЦП (данные прибыли, например).

Так как они могут происходить очень часто, и так как они по существу блокируют текущий ЦП, в то время как они работают, обработчики аппаратных прерываний ядра записаны, чтобы быть максимально быстрыми и простыми.

Если долго или сложная обработка должен быть сделан, эти задачи задерживаются с помощью вызова механизма softirqs. Они планируются независимо, может работать на любом ЦП, может даже работать одновременно (ничего подобного не верен для обработчиков аппаратных прерываний).

Часть о твердом IRQs блокирование текущего ЦП и части о softirqs способность работать никуда не точно корректна, могут быть ограничения и некоторые трудно, что IRQs может прервать других.

Как пример, "данные, полученные" аппаратное прерывание от сетевой платы, могли просто хранить информацию "карта ethX, должен быть обслужен" где-нибудь и расписание a softirq. softirq была бы вещь, которая инициировала маршрутизацию действительного пакета.

si представляет время, проведенное в них softirqs.

Хорошее чтение о softirq механизмом (с небольшим количеством истории также) является Matthew Wilcox, я Сделаю Это Позже: Softirqs, Tasklets, Нижние половины, Очереди Задачи, Очереди заданий и Таймеры (PDF, 64k).

st, "время кражи", только релевантно в виртуализированных средах. Это представляет время, когда реальный ЦП не был доступен текущей виртуальной машине — это было "украдено" от этого VM гипервизором (или для выполнения другого VM, или для его собственных потребностей).

Процессорное время бухгалтерский документ от IBM имеет больше информации во время кражи и ЦП, считающего в виртуализированных средах. (Это нацелено на аппаратные средства типа zSeries, но общее представление является тем же для большинства платформ.)

118
13.02.2015, 17:21
5 ответов

Канонический инструмент для этого был бы sed.

sed -n -e 's/^.*stalled: //p'

Подробное объяснение:

  • -n средства не распечатать что-либо по умолчанию.
  • -e сопровождается командой sed.
  • s заменяющая команда шаблона.
  • Регулярное выражение ^.*stalled: соответствует шаблону, который Вы ищете плюс любой предыдущий текст (.* значение любого текста, с начальной буквой ^ сказать, что матч начинается в начале строки). Отметьте это если stalled: несколько раз происходит на строке, это будет соответствовать последнему вхождению.
  • Соответствие, т.е. все на строке до stalled:, заменен пустой строкой (т.е. удален).
  • Финал p средства распечатать преобразованную строку.

Если Вы хотите сохранить часть соответствия, используйте обратную ссылку: \1 в сменной детали определяет то, что в группе \(…\) в шаблоне. Здесь, Вы могли записать stalled: снова в сменной детали; эта функция полезна, когда шаблон, который Вы ищете, является более общим, чем простая строка.

sed -n -e 's/^.*\(stalled: \)/\1/p'

Иногда Вы будете хотеть удалить часть строки после соответствия. Можно включать его в соответствие включением .*$ в конце шаблона (любой текст .* сопровождаемый к концу строки $). Если Вы не помещаете ту часть в группу, на которую Вы ссылаетесь в тексте замены, конец строки не будет в выводе.

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

sed -n -e 's/^\(.*\)\(stalled: \)\(.*\)$/\3\2\1/p'
149
27.01.2020, 19:29
  • 1
    я попробовал первые два примера и это просто, кажется, зависает. Я не получаю сообщение об ошибке, и при этом я не получаю новую подсказку, просто ничто. –  MaQleod 08.11.2011, 03:00
  • 2
    @MaQleod, О, это ожидает входа на стандартном входе, который вот терминал, потому что Вы не перенаправили его. Здесь Вы сделали бы перенаправление ввода sed … <messages, так как Вы хотите обработать данные из файла. Для действия на данные, произведенные другой командой, Вы использовали бы канал: somecommand | sed …. –  Gilles 'SO- stop being evil' 08.11.2011, 03:02
  • 3
    , конец дневного отключения питания там. управляйте работает отлично, спасибо. –  MaQleod 08.11.2011, 18:37
  • 4
    Лучшее sed объяснение я видел до сих пор - Спасибо! –  Jon Wadsworth 16.09.2016, 20:47
  • 5
    @ungalcrys Более короткая версия какой? Это не эквивалентно ни одной из команд в моем ответе. Я рекомендовал бы писать это как sed 's/^.*stalled//' с тех пор -r характерно для Linux и не работает над другими системами, такими как macOS, и здесь Вы не извлекаете пользы из него. –  Gilles 'SO- stop being evil' 09.08.2017, 13:19

Другой канонический инструмент, который Вы уже используете: grep:

Например:

grep -o 'stalled.*'

имеет тот же результат, что и вторая опция Жиля:

sed -n -e 's/^.*\(stalled: \)/\1/p'

Флаг -o возвращает -только-соответствующую часть выражения, так что не вся строка, которая - разумеется - обычно выполняется grepом.

Для удаления "stalled :" из вывода можно использовать третий канонический инструмент, cut:

grep -o 'stalled.*' | cut -f2- -d:

Команда cut использует разделитель : и распечатывает поле 2 до конца. Конечно, это дело предпочтений, но синтаксис cut я нахожу очень легким для запоминания.

77
27.01.2020, 19:29

Я использовал ifconfig | grep eth0 | cut -f3- -d: , чтобы взять этот

    [root@MyPC ~]# ifconfig
    eth0  Link encap:Ethernet  HWaddr AC:B4:CA:DD:E6:F8
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:78998810244 errors:1 dropped:0 overruns:0 frame:1
          TX packets:20113430261 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:110947036025418 (100.9 TiB)  TX bytes:15010653222322 (13.6 TiB)

и сделать его таким, как это

    [root@MyPC ~]# ifconfig | grep eth0 | cut -f3- -d:
    C4:7A:4D:F6:B8
4
27.01.2020, 19:29

Еще один канонический инструмент, который вы рассматривали awk, можно использовать со следующей строкой:

awk -F"stalled" '/stalled/{print $2}' messages

Подробное объяснение:

  • -Fопределяет разделитель для строки, т. е. «остановка». Все до разделителя адресуется с помощью $1, а все после с помощью $2.
  • /reg-ex/Ищет подходящее регулярное выражение, в данном случае "остановлено".
  • {print $<n>}-выводит n столбцов. Поскольку ваш разделитель определен как остановленный, все после остановленного считается вторым столбцом.
6
27.01.2020, 19:29

там кажется более простой способ. просто сделай:

sed "s/installed.*//g"

, который удаляет все слова после «установлен».

for i in *
do
    se=$(echo $i|sed "s/---.*//g")
    echo $se
    mv "$i" $se
done
0
27.01.2020, 19:29

Теги

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