Рейтинг:1

Извлечение конкретной информации из файла

флаг cn

У меня есть файл, созданный из команды, которую я запускаю в своей системе. После создания файла я хочу извлечь из этого файла только определенную информацию, но только если она соответствует определенным критериям.

Вот как выглядит мой файл:

клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
        соединение-1: frdp::Green::Test
        соединение-0: frdp::Purple::Test
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
        соединение-0: frdp::Purple::Test
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
        соединение-0: frdp::Purple::Test
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
        соединение-0: frdp::Purple::Test
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
        соединение-0: frdp::Green::Test
клиент: tc-ххххххх-хххх-хххх-хххх-хххххххххххх
        версия: хххх
        UUID: ххххххх-хххх-хххх-хххх-хххххххх
        пользовательский идентификатор: 10000
        Пользователь: Someuser
        основной сервер: xxx.xxx.xxx.xxx
        режим работы: нормальный
        макинтош: ХХ:ХХ:ХХ:ХХ:ХХ:ХХ
        время блокировки: xx:xx:xx
        IP-адрес: xxx.xxx.xxx.xxx
        имя хоста: tc-ххххххх-хххх-хххх-хххх-ххххххххххх
        соединение-1: frdp::Green::Test
        соединение-0: frdp::Purple::Test

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

РЕДАКТИРОВАТЬ: я добавил записи в файл.

James S. avatar
флаг de
Вы контролируете генерацию этого файла? То есть это вывод написанной вами программы? В более общем смысле, какая команда генерирует этот вывод? почему это вопрос об Ubuntu?
флаг cn
Команда, которая создает список, является частной, и система работает поверх Ubuntu. Файл создается путем запуска команды и перенаправления вывода в файл. Это формат после запуска команды.
James S. avatar
флаг de
Многие приложения работают «поверх Ubuntu», но поддержка этих приложений не является вопросом *о* Ubuntu. Вы задаете общий вопрос по обработке текста, и существует несколько тысяч способов разобрать этот файл. Вы можете попробовать спросить в более общем обмене стеками unix и linux.
флаг cn
Спасибо за помощь. Я сделаю это.
Рейтинг:0
флаг jp

Если я правильно понимаю, что вы хотите, это отфильтровать клиентов с подключениями, отличными от «фиолетового» (в вашем примере только «зеленый», но, возможно, и других цветов).

Следующие команды используют grep чтобы удалить линии с «Фиолетовым», тр сделать одну линию и сед поставить разрывы строк перед «клиентом» и, наконец, grep убрать оставшиеся строчки с 'подключением' и выбрать только нужную информацию для каждого клиента.

Весь информационный набор:

< myfile grep -v 'Фиолетовый' | тр '\n' ' '| тр -с ' ' ' | sed "s/ клиент/\nclient/g" \
| grep -v 'соединение'

Имя хоста и все, что указано позади:

< myfile grep -v 'Фиолетовый' | тр '\n' ' '| тр -с ' ' ' | sed "s/ клиент/\nclient/g" \
| grep -v 'соединение' | grep -o 'имя хоста: .*'

Только имя хоста, которое вы хотели, согласно тому, что я мог прочитать:

< myfile grep -v 'Фиолетовый' | тр '\n' ' '| тр -с ' ' ' | sed "s/ клиент/\nclient/g" \
| grep -v 'соединение' | grep -o 'имя хоста: [^ ]*'

Другая группа (которая должна быть отфильтрована) с именем хоста и подключением, отличным от «Фиолетового»:

< myfile grep -v 'Фиолетовый' | тр '\n' ' '| тр -с ' ' ' | sed "s/ клиент/\nclient/g" \
| grep 'соединение' | grep -o 'имя хоста: .*'
Рейтинг:0
флаг cn

Ваш входной файл слишком короткий, чтобы точно понять, что вы хотите. Но вы можете попробовать это для начала:

awk '/hostname|Purple/' мой файл
флаг cn
Последний клиент — это тот, у которого нет активного соединения. Так что последняя запись короче. Мне также нужно включить этого клиента в мой новый список.
флаг cn
Мне удалось получить имя хоста с подключениями или без них в список. awk -F '\t' 'имя хоста:/ || /connection/' мой файл >> уточненный файл

Ответить или комментировать

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