如何使用 bash 获取正确的文本

如何使用 bash 获取正确的文本

我是 Bash 脚本的新手。我尝试编写脚本来检查设备(tp-link、cisco、lynksys...)是否通过 telnet 连接并获取一些信息。

因此第一个脚本运行没有问题:

#!/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

当我制作时:cat name.date.txt我得到了这个结果


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

所以我只需要导出这一行 1、2 和 4,如下所示:

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

“Vlan Mac 地址类型端口”之前不需要任何内容

所以我写了这个脚本:

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

我得到了这个结果:

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

修复谁?

我只导出以下信息的文件:

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

如果我可以导出到表格或 csv 就更好了

感谢回答

答案1

假设您想使用 awk 打印从$1等于All到文件末尾的行:

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

next如果要包含匹配的行,请省略)。

为了使输出以逗号分隔,请将输出字段分隔符设置为“,”并通过评估强制重建记录,$1=$1例如:

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

答案2

有几个选项,但你还没有定义明确的标准 - 所以我在这里主要是猜测。

如果您需要的输出始终位于文件底部,则可以使用tail获取最后 X 行,例如:

tail -n 6 name.date.txt 

... 将为您提供最后 6 行(表格)。

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

另一个选项是用来grep搜索模式,例如:

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

STATIC... 将匹配包含单词或 的行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

相关内容