Вопрос или проблема
Я использую ssh для входа на удаленный сервер (Ubuntu) и затем выполняю команду, которая выводит текст/значение каждую секунду (живой скрипт).
В живом выводе я хочу отфильтровать строки, содержащие 'dlsch_rounds'
. Для этого я использую command | grep 'dlsch_rounds'
, что дает правильный результат.
UE 4aae: dlsch_rounds 22/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.03874 MCS 9
Теперь я хочу еще больше отфильтровать, чтобы он показывал только BLER 0.03874
.
Если я использую command | grep 'dlsch_rounds' | awk '{print $8}'
, это совсем не дает вывода. С другой стороны, если я сохраняю вывод в файл и затем использую вместе grep и awk, это работает нормально. Что я делаю не так?
Ответ или решение
Проблема, с которой вы столкнулись при использовании grep
и awk
в реальном времени, скорее всего, связана с тем, как обрабатываются входные данные и вывод команд в Unix-подобных системах. Давайте разберем вашу ситуацию более подробно.
Анализ проблемы
Вы используете SSH для подключения к удаленному серверу и запускаете команду, которая выводит данные каждую секунду. Вам необходимо отфильтровать строки, содержащие dlsch_rounds
, а затем извлечь только значение BLER 0.03874
.
Когда вы запускаете команду
command | grep 'dlsch_rounds'
результат выводится корректно, и вы видите нужные строки. Однако добавление awk
:
command | grep 'dlsch_rounds' | awk '{print $8}'
не дает ожидаемого результата. Причиной этого может быть то, что awk использует пробелы для разделения полей, и, если строки, которые вы обрабатываете, содержат дополнительные пробелы или символы (например, запятые), это может влиять на вывод.
Решение проблемы
- Проверка разделителей: Убедитесь, что разделитель в строке действительно пробел. Вы можете использовать
awk
с заданными разделителями:
command | grep 'dlsch_rounds' | awk -F'[ ,]' '{print $8}'
Здесь мы устанавливаем ,
и пробелы в качестве разделителей, чтобы гарантировать, что awk
сможет корректно извлечь нужное значение.
- Использование дополнительных инструментов: Если
awk
по-прежнему не работает, вы можете собрать информацию с помощью дополнительных фильтров. Например, используяsed
для удаления лишних символов или переопределения поля:
command | grep 'dlsch_rounds' | sed 's/.*BLER //; s/,.*//'
В этом случае sed
убирает все лишнее, оставляя только значение BLER
.
- Проверка вывода в реальном времени: В некоторых случаях данные могут выводиться нестандартно в реальном времени, что может вызвать проблемы с предыдущими подходами. Для отладки вы можете записывать вывод в файл и затем визуализировать его несколько раз, чтобы убедиться, что он соответствует ожиданиям.
Заключение
Эти подходы должны помочь вам правильно обрабатывать данные в реальном времени с использованием grep
и awk
. Попробуйте указанные методы, и, скорее всего, одно из решений сработает. Если у вас будут дополнительные вопросы или проблемы, не стесняйтесь их задавать.