Celeb Glow
news | March 21, 2026

How to get the right text with bash

I am new in bash scripts. I try to make script who check devices ( tp-link, cisco, lynksys... ) to connect via telnet and get some info.

So the first script work with no problem:

#!/bin/sh
NOW=$(date +"%m-%d-%Y")
HOST='IPADDRES'
USER='USER'
PASSWD='PASSWORD'
CMD='enable'
CMD2='show mac address-table'
CMD3='terminal length 0'
(echo "$HOST - " ; ( echo open "$HOST" sleep 1 echo "$USER" sleep 1 echo "$PASSWD" sleep 1 echo "$CMD" sleep 1 echo "$CMD3" sleep 1 echo "$CMD2\n" sleep 30 echo "exit" ) | telnet ) > name.$NOW.txt

When I make: cat name.date.txt I get this resulst

hostname1 -
telnet> Trying hostname1...
Connected to hostname1.
Escape character is '^]'.
User Access Verification
Username:
Password: Welcome to BDCOM P3310C EPON OLT
hostname1>enable
hostname1#terminal length 0
hostname1#show mac address-table Mac Address Table (Total 311)
------------------------------------------
Vlan Mac Address Type Ports
---- ----------- ---- -----
All 8479.735b.9132 STATIC CPU
300 44d9.e776.d8b7 DYNAMIC g0/3
300 4c5e.0cff.6dea DYNAMIC g0/3
300 d4ca.6d9e.3280 DYNAMIC g0/3

So I need export just this line 1 2 and 4 its like this:

300 44d9.e776.d8b7 DYNAMIC g0/3
300 4c5e.0cff.6dea DYNAMIC g0/3
300 d4ca.6d9e.3280 DYNAMIC g0/3

I don`t need anything before "Vlan Mac Address Type Ports"

So I make this script:

cat name.date.txt | awk '$1<"ALL"{print $1" ",$2" ",$3" ",$4}'

And I get this result:

hostname1 - -----------------------------
---- ----------- ---- -----
300 44d9.e776.d8b7 DYNAMIC g0/3
300 0002.9b80.7f28 DYNAMIC g0/3
300 0002.9b65.7b66 DYNAMIC g0/3
300 4c5e.0cff.6dea DYNAMIC g0/3
300 d4ca.6d9e.3280 DYNAMIC g0/3

Who to fix ?

I just export file only this info:

300 44d9.e776.d8b7 DYNAMIC g0/3
300 0002.9b80.7f28 DYNAMIC g0/3
300 0002.9b65.7b66 DYNAMIC g0/3
300 4c5e.0cff.6dea DYNAMIC g0/3
300 d4ca.6d9e.3280 DYNAMIC g0/3

If will be better if I can export to table or csv

Thanks for answers

4

2 Answers

Assuming you want to print lines from where $1 is equal to All until the end of the file using awk:

awk '$1=="All" {p=1; next} p' name.date.txt

(omit the next if you want to include the matching line).

To make the output comma separated, set the output field separator to "," and force reconstruction of the record by evaluating $1=$1 for example:

awk '$1=="All" {p=1; OFS=","; next} p {$1=$1; print}' name.date.txt

There are several options, but you haven't defined your clear criteria - so I'm mostly guessing here.

If the output you need is consistently in the bottom of your file, you can use tail to get the last X lines, e.g.:

tail -n 6 name.date.txt 

... will give you the last 6 lines (the table).

Vlan Mac Address Type Ports
---- ----------- ---- -----
All 8479.735b.9132 STATIC CPU
300 44d9.e776.d8b7 DYNAMIC g0/3
300 4c5e.0cff.6dea DYNAMIC g0/3
300 d4ca.6d9e.3280 DYNAMIC g0/3

Another option is to use grep to search for a pattern, e.g.:

grep 'STATIC\|DYNAMIC' name.date.txt

... will match those lines that include either the word STATIC or DYNAMIC.

All 8479.735b.9132 STATIC CPU
300 44d9.e776.d8b7 DYNAMIC g0/3
300 4c5e.0cff.6dea DYNAMIC g0/3
300 d4ca.6d9e.3280 DYNAMIC g0/3
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy