Рейтинг:0

Как получить правильный текст с помощью bash

флаг bz

Я новичок в сценариях bash. Я пытаюсь сделать скрипт, который проверяет устройства (tp-link, cisco, lynksys...) для подключения через telnet и получения некоторой информации.

Итак, первый скрипт работает без проблем:

#!/бин/ш
СЕЙЧАС=$(дата +"%m-%d-%Y")
ХОСТ='IP-АДРЕС'
ПОЛЬЗОВАТЕЛЬ='ПОЛЬЗОВАТЕЛЬ'
ПАРОЛЬ='ПАРОЛЬ'
CMD='включить'
CMD2 = 'показать таблицу MAC-адресов'
CMD3='длина терминала 0'

(эхо "$HOST-" ; (
    эхо открыть "$HOST"
    спать 1
    эхо "$ ПОЛЬЗОВАТЕЛЬ"
    спать 1
    эхо "$PASSWD"
    спать 1
    эхо "$CMD"
    спать 1
    эхо "$CMD3"
    спать 1
    эхо "$CMD2\n"
    спать 30
    эхо "выход"
    ) | telnet ) > имя.$NOW.txt

Когда я делаю: имя кота.date.txt я получаю этот результат


имя хоста1 -
telnet> Попытка hostname1...
Подключен к hostname1.
Экранирующий символ '^]'.
Проверка доступа пользователя

Имя пользователя: 
Пароль:








                 Добро пожаловать в BDCOM P3310C EPON OLT




имя_хоста1>включить
hostname1#длина терминала 0
hostname1 # показать таблицу MAC-адресов
        Таблица адресов Mac (всего 311)
---------------------------------------------

Порты типа адреса Vlan Mac
---- ----------- ---- -----
Все 8479.735b.9132 СТАТИЧЕСКИЕ ЦП
300 44d9.e776.d8b7 ДИНАМИЧЕСКИЙ g0/3
300 4c5e.0cff.6dea ДИНАМИЧЕСКАЯ g0/3
300 d4ca.6d9e.3280 ДИНАМИЧЕСКИЙ g0/3

Поэтому мне нужно экспортировать только эту строку 1, 2 и 4. это вот так:

300 44d9.e776.d8b7 ДИНАМИЧЕСКИЙ g0/3
300 4c5e.0cff.6dea ДИНАМИЧЕСКАЯ g0/3
300 d4ca.6d9e.3280 ДИНАМИЧЕСКИЙ g0/3

Мне ничего не нужно раньше "Порты типа Vlan Mac Address"

Итак, я делаю этот скрипт:

имя кота.date.txt | awk '$1<"ВСЕ"{print $1" ",$2" ",$3" ",$4}'

И я получаю этот результат:

имя хоста1 -














             -----------------------------

---- ----------- ---- -----
300 44d9.e776.d8b7 ДИНАМИЧЕСКИЙ g0/3
300 0002.9b80.7f28 ДИНАМИЧЕСКАЯ g0/3
300 0002.9b65.7b66 ДИНАМИЧЕСКИЙ g0/3
300 4c5e.0cff.6dea ДИНАМИЧЕСКАЯ g0/3
300 d4ca.6d9e.3280 ДИНАМИЧЕСКИЙ g0/3

Кого исправить?

Я просто экспортирую в файл только эту информацию:

300 44d9.e776.d8b7 ДИНАМИЧЕСКИЙ g0/3
300 0002.9b80.7f28 ДИНАМИЧЕСКАЯ g0/3
300 0002.9b65.7b66 ДИНАМИЧЕСКИЙ g0/3
300 4c5e.0cff.6dea ДИНАМИЧЕСКАЯ g0/3
300 d4ca.6d9e.3280 ДИНАМИЧЕСКИЙ g0/3

Если будет лучше, если я смогу экспортировать в таблицу или csv

Спасибо за ответы

terdon avatar
флаг cn
Эй! Не используйте CAPS для имен переменных в сценариях оболочки. Заглавные буквы используются для глобальных переменных среды, поэтому использование одного и того же имени может вызвать непредвиденные проблемы. Например, `$USER` — это глобальная переменная окружения, для которой установлено имя текущего пользователя, поэтому вам _на самом деле_ не нужно менять ее в скрипте.
Petar Petrov avatar
флаг bz
Да, я не использую USER, как admin или petar Просто здесь я поставил USER
terdon avatar
флаг cn
Я говорю об именах ваших переменных. Вы должны использовать `$user`, а не `$USER` и `$host`, а не `$HOST` и т. д. Не рекомендуется использовать CAPS для имен переменных оболочки.
Petar Petrov avatar
флаг bz
Я понимаю, что ты прав. исправлю, спасибо
Рейтинг:4
флаг hr

Предполагая, что вы хотите печатать строки, откуда $1 равно Все до конца файла с помощью awk:

awk '$1=="Все" {p=1; следующий} p' name.date.txt

(опустить следующий если вы хотите включить соответствующую строку).

Чтобы разделить выходную запятую, установите разделитель выходных полей на «,» и принудительно восстановите запись, оценив $1=$1 Например:

awk '$1=="Все" {p=1; ОФС=","; следующий} p {$1=$1; print}' имя.дата.txt
Рейтинг:1
флаг vn

Есть несколько вариантов, но вы не определили свои четкие критерии, так что здесь я в основном угадываю.

Если нужный вам вывод постоянно находится в нижней части вашего файла, вы можете использовать хвост чтобы получить последние X строк, например:

хвост -n 6 имя.дата.txt 

... даст вам последние 6 строк (таблица).

Порты типа адреса Vlan Mac
---- ----------- ---- -----
Все 8479.735b.9132 СТАТИЧЕСКИЕ ЦП
300 44d9.e776.d8b7 ДИНАМИЧЕСКИЙ g0/3
300 4c5e.0cff.6dea ДИНАМИЧЕСКАЯ g0/3
300 d4ca.6d9e.3280 ДИНАМИЧЕСКИЙ g0/3

Другой вариант — использовать grep для поиска шаблона, например:

grep 'СТАТИЧЕСКИЙ\|ДИНАМИЧЕСКИЙ' name.date.txt

... будут соответствовать тем строкам, которые содержат слово СТАТИЧЕСКИЙ или же ДИНАМИЧЕСКИЙ.

Все 8479.735b.9132 СТАТИЧЕСКИЕ ЦП
300 44d9.e776.d8b7 ДИНАМИЧЕСКИЙ g0/3
300 4c5e.0cff.6dea ДИНАМИЧЕСКАЯ g0/3
300 d4ca.6d9e.3280 ДИНАМИЧЕСКИЙ g0/3
Petar Petrov avatar
флаг bz
Здравствуйте, спасибо за ответ. Вариант "grep 'STATIC\|DYNAMIC' name.date.txt" мне идеально подходит. Спасибо

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

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