如何grep查找由于“”字符(破折号)而导致误报的精确字符串

2024-06-28 18:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

各位早上好,

我正在制作一个程序,将日志中的主机名与其他日志中的主机名进行比较。此程序的目的是确保网络的三个记录器(资产)(配置)(日志)正确地执行其工作,并记录网络上的所有主机名设备。我已经完成了脚本,但是现在我想使用unixsbash命令grep检查它们结果的有效性。我解析了所有三个日志文件,以确保没有遗漏任何内容,或者我的脚本意外地将主机名标记为拖欠,即使它正确地记录了日志

要显示为假阳性,搜索的主机名必须满足以下条件:

  1. 拖欠主机名在日志中至少显示一次,并在日志中标记为拖欠
  2. 主机名是唯一的,必须完全匹配,部分匹配不应触发结果

我一直在试验grep命令选项调用,但由于“-”字符,我无法解析出想要的结果。我不断得到显示部分匹配的结果,这不是我想要的

下面是我在python中运行的代码,使用子流程调用os bash命令:

    #First check the Asset accuracy
    for hostname in data['loggers']['asset']:
        #Call to an os bash command to check if the asset is listed
        if subprocess.run('show asset report csv | 'f'grep -Fm1 {hostname} ',
                              shell=True, check=False,
                              capture_output=False, ).returncode == 0:
            #If the asset shows up, mark as a false positive
            print(f'[ ! ] Hostname {hostname} is an Asset false positive')
            asset_false_positive.add(hostname)

    #Second check the config accuracy
    for hostname in data['loggers']['config']:
        #Call to an os bash command to see if the config is listed
        if subprocess.run(f'findconf {hostname}', shell=True, check=False,
                         capture_output=False).returncode == 0:
            print(f'[ ! ] Hostname {hostname} is a Config false positive')
            config_false_positive.add(hostname)

    #Third check the Log accuracy.
    for hostname in data['loggers']['log']:
        #Call to an os bash command to check if the log is listed
        if subprocess.run(f'grep -Fm1 {hostname} /var/log/{manufacturer[system]}',
                              shell=True, check=False).returncode == 0:
            print(f'[ ! ] False Positive Hostname: {hostname} in {manufacturer[system]}')

其中findconf()具有bash代码:

findconf() { 
    find /home/net/hp/ /home/net/juniper/ /home/net/cisco/ /home/net/extreme/ -name "$1".config; 
}

我发现目前我的结果中存在真假阳性,如下所示: enter image description here

但我的大多数结果都是假阳性(对不起,是双阴性),例如: enter image description here

这是记录器原始输出(log)的一小部分:

Nov 30 00:29:24 vdl-e217-sw2.net.msu.edu vdl-e217-sw2 : %PFE-6: fpc2 PORTDEV: Optic state changed for VCP port: 2/1/2 - Presence: 1
Nov 30 00:29:24 bam-088-sw3.net.msu.edu bam-088-sw3 mgd[81468]: %INTERACT-6-UI_LOGIN_EVENT: User 'root' login, class 'super-user' fpc0[81468], ssh-connection '', client-mode 'junoscript'
Nov 30 00:29:24 crdc-am21-icer-sw2.net.msu.edu crdc-am21-icer-sw2 : %PFE-3: fpc0 bcm pkt reinsert failed
Nov 30 00:29:24 cc-t1-re0.net.msu.edu cc-t1-re0 rmopd[6850]: %DAEMON-6-PING_TEST_COMPLETED: pingCtlOwnerIndex = ping-probe, pingCtlTestName = ping-cc-core-mx
Nov 30 00:29:24 bam-088-sw3.net.msu.edu bam-088-sw3 mgd[81468]: %INTERACT-6-UI_CMDLINE_READ_LINE: User 'root', command 'command rpc rpc command show version no-forwarding '
Nov 30 00:29:24 bam-088-sw3.net.msu.edu bam-088-sw3 mgd[81468]: %INTERACT-6-UI_JUNOSCRIPT_CMD: User 'root' used JUNOScript client to run command 'get-software-information'
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0  FAILED to read the phy for port: 9 length: 2
Nov 30 00:29:24 cc-core-mx-re0.net.msu.edu cc-core-mx-re0 kernel: %KERN-6-KERN_ARP_ADDR_CHANGE: arp info overwritten for 35.8.223.64 from 00:15:5d:df:93:e2 to 00:15:5d:df:93:d9
Nov 30 00:29:24 cc-core-mx-re0.net.msu.edu cc-core-mx-re0 kernel: %KERN-6-KERN_ARP_ADDR_CHANGE: arp info overwritten for 35.8.223.64 from 00:15:5d:df:93:d9 to 00:15:5d:df:93:e2
Nov 30 00:29:24 pp65-102a-sw1.net.msu.edu pp65-102a-sw1 rpd[1259]: %DAEMON-6: EVENT <UpDown> ge-0/0/11.0 index 82 <Up Broadcast Multicast> address #0 f0.1c.2d.b8.a8.e
Nov 30 00:29:24 test-crdc-todc1.net.msu.edu test-crdc-todc1 rpd[7948]: %DAEMON-4-JTASK_IO_CONNECT_FAILED: BGP_65027_65027.35.12.225.80: Connecting to 00.b323.0ce1.5000.0000.0000.0000.00 failed: No route to host
Nov 30 00:29:24 test-crdc-todc1.net.msu.edu test-crdc-todc1 rpd[7948]: %DAEMON-3-BGP_CONNECT_FAILED: bgp_connect_start: connect 35.12.225.80 (Internal AS 65027) (instance dcn-vsi-nsx): No route to host
Nov 30 00:29:24 pp65-102a-sw1.net.msu.edu pp65-102a-sw1 rpd[1259]: %DAEMON-6: EVENT <UpDown> ge-0/0/11 index 141 <Up Broadcast Multicast> address #0 f0.1c.2d.b8.a8.e
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0  FAILED to read the phy for port: 9 length: 2
Nov 30 00:29:24 crdc-am21-icer-sw2.net.msu.edu crdc-am21-icer-sw2 : %PFE-3: fpc0 bcm pkt reinsert failed
Nov 30 00:29:24 pp65-102a-sw1.net.msu.edu pp65-102a-sw1 mib2d[1258]: %DAEMON-6-SNMP_TRAP_LINK_UP: ifIndex 524, ifAdminStatus up(1), ifOperStatus up(1), ifName ge-0/0/11
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0  FAILED to read the phy for port: 9 length: 2
Nov 30 00:29:24 pp65-102a-sw1.net.msu.edu pp65-102a-sw1 mib2d[1258]: %DAEMON-6-SNMP_TRAP_LINK_UP: ifIndex 525, ifAdminStatus up(1), ifOperStatus up(1), ifName ge-0/0/11.0
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0 DCBCM[ge-0/0/9]: Failed to read XCVR phy at i2c_dev:9 reg:11 failed... giving up!
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0 DCBCM[ge-0/0/9]: dcbcm_xcvr_phy_mdio_sgmii_lnk_op - Failed to MDIO read:    ifd      = 672 ge-0/0/9         phy_addr = 9         phy_reg  = 17
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0 ala88e1111_reg_read:  Failed (1000) to read register phy_addr 0x9,  reg 0x11
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0 Fails in function ala88e1111_get_link_status
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0 DCBCM [ge-0/0/9]: Failed to get phy layer link status, err(1000)
Nov 30 00:29:24 ccdc-l40-sw2.net.msu.edu ccdc-l40-sw2 : %PFE-3: fpc0 DCBCM[ge-0/0/9]: Link information get failed
Nov 30 00:29:24 bam-088-sw3.net.msu.edu bam-088-sw3 mgd[81468]: %INTERACT-6-UI_JUNOSCRIPT_CMD: User 'root' used JUNOScript

我尝试在主机名前后添加空格,并将其设置为固定字符串。我没有得到任何结果。 我也试过白鹭,-w,以及所有可能的-Fwe组合

如何在不获得“-”字符部分匹配的情况下grep主机名

TL;博士 由于前面和后面的“-”字符,在我的grep命令中获得部分匹配。我怎样才能获得准确的结果


Tags: thetofornetphynovhostname主机名