Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 删除文件中的半唯一字符串_String_Awk_Sed_Diff_Uniq - Fatal编程技术网

String 删除文件中的半唯一字符串

String 删除文件中的半唯一字符串,string,awk,sed,diff,uniq,String,Awk,Sed,Diff,Uniq,我正在编写一个脚本来跟踪路由表中的更改。该脚本每隔5分钟拉取路由表的快照,并将该表与5分钟前的版本进行区分。如果文件中存在偏差,脚本将生成一封电子邮件。问题是每条线路都有一个年龄计数器,表示路线的年龄,因此该字段总是在变化。以下是来自生产路由器的已修改快照: 编辑 为确保完整性,添加了具有秒和分钟期限的路由 B* 0.0.0.0/0 [200/0] via 1.0.10.121, 1d13h [200/0] via 1.0.10.111, 1d13h

我正在编写一个脚本来跟踪路由表中的更改。该脚本每隔5分钟拉取路由表的快照,并将该表与5分钟前的版本进行区分。如果文件中存在偏差,脚本将生成一封电子邮件。问题是每条线路都有一个年龄计数器,表示路线的年龄,因此该字段总是在变化。以下是来自生产路由器的已修改快照:

编辑 为确保完整性,添加了具有秒和分钟期限的路由

B*    0.0.0.0/0 [200/0] via 1.0.10.121, 1d13h
                [200/0] via 1.0.10.111, 1d13h
      10.0.0.0/8 is variably subnetted, 159 subnets, 7 masks
O N1     10.0.0.1/32 [210/21] via 172.18.10.27, 1d13h, Vlan1503
O N1     10.1.0.0/16 [210/21] via 172.18.10.51, 2d17h, Vlan1506
O N1     10.2.0.0/16 [210/21] via 172.18.10.59, 2d17h, Vlan1507
B        10.10.0.0/16 [200/0] via 0.0.0.0, 2d17h, Null0
B        10.186.14.0/24 [200/0] via 1.0.10.124, 1d13h
                        [200/0] via 1.0.10.114, 1d13h
B        10.186.15.0/24 [200/0] via 1.0.10.124, 1d13h
O N2     10.192.32.0/21 [210/20] via 172.18.10.243, 2d17h, Vlan1508
O N2     10.192.40.0/21 [210/20] via 172.18.10.243, 2d17h, Vlan1508
B        10.193.0.0/24 [200/0] via 1.0.10.124, 1d13h
                       [200/0] via 1.0.10.114, 1d13h
C        172.18.10.232/29 is directly connected, Vlan1589
L        172.18.10.233/32 is directly connected, Vlan1589
B        205.1.2.3/27 [200/21] via 1.0.30.5, 2d17h
B     205.3.2.1/24 [200/20] via 1.0.30.5, 2d17h
O N1     2.2.2.2 [110/2] via 192.168.0.2, 00:08:48, Vlan1500
O N1     10.10.83.0/24 [210/21] via 172.18.10.27, 00:00:48, Vlan1503
请注意所有的“2d17h”、“1d13h”等,这些都是不断增加的年龄计数器,直到设备停机或链路断开,然后重置。然而,路线的年代对我来说并不是那么重要,只是路线存在并且“下一跳”(也称为via)没有改变。否则,我只需“wc-l”这两个文件,并确保长度相同

是否可以从文件中删除年龄计数器,然后对其进行区分?如果是,移除计数器的最佳方法是什么

谢谢

编辑所需输出相同,但删除了年龄计数器,如下所示:

B*    0.0.0.0/0 [200/0] via 1.0.10.121,
                [200/0] via 1.0.10.111,
      10.0.0.0/8 is variably subnetted, 159 subnets, 7 masks
O N1     10.0.0.1/32 [210/21] via 172.18.10.27, , Vlan1503
O N1     10.1.0.0/16 [210/21] via 172.18.10.51, , Vlan1506
O N1     10.2.0.0/16 [210/21] via 172.18.10.59, , Vlan1507
B        10.10.0.0/16 [200/0] via 0.0.0.0, , Null0
B        10.186.14.0/24 [200/0] via 1.0.10.124,
                        [200/0] via 1.0.10.114,
B        10.186.15.0/24 [200/0] via 1.0.10.124,
O N2     10.192.32.0/21 [210/20] via 172.18.10.243, , Vlan1508
O N2     10.192.40.0/21 [210/20] via 172.18.10.243, , Vlan1508
B        10.193.0.0/24 [200/0] via 1.0.10.124,
                       [200/0] via 1.0.10.114,
C        172.18.10.232/29 is directly connected, Vlan1589
L        172.18.10.233/32 is directly connected, Vlan1589
B        205.1.2.3/27 [200/21] via 1.0.30.5,
B     205.3.2.1/24 [200/20] via 1.0.30.5,
O N1     2.2.2.2 [110/2] via 192.168.0.2, , Vlan1500
O N1     10.10.83.0/24 [210/21] via 172.18.10.27, , Vlan1503
我试图阻止的是两个相同的表(相同数量的路由,相同的下一个跃点)在差异中失败,因为其中一个路由年龄计数器在路由表的快照之间打勾。例如:

  • 脚本拍摄路由表的快照,一切正常,但一条路由的时间为00:59:59(59分59秒)
  • 5分钟后,脚本对路由表进行快照,没有删除或添加路由,但是当前表和5分钟旧表之间的差异失败,因为00:59:59的路由现在已经有1d0h了(我假设计数器是1d0h,需要确认它不是2d1h)

  • 所以我的想法是,如果我去掉所有的年龄计数器,差异就不会失败。这可能不是实现监视路由表目标的最佳方法。不幸的是,我没有很强的脚本或编程背景。不过,我愿意听取意见,欢迎提出所有建议。:)

    要从示例输入中删除年龄值,可以匹配整个目标行的语法,而不是“剧烈变化的时间戳”。
    (从您的评论中得到的措辞巧妙的总结,谢谢。)

    (GNU-sed版本4.2.1,即支持
    -e

    • -E
      为了方便起见,使用扩展正则表达式
    • s/via/

      从适当外观的线条中删除年龄
    我还删除了丑陋的“,”随着年龄的增长而来。
    如果要保留它,请将其替换为“
    ”、“
    ”、“
    ”,即冒号空格后的para,而不是前面的para

    我认为这是复杂的上端,与SED有关,它与一个SED大脑逗留者有关(这是我做这件事的真正原因,为了好玩)。 此外,语法的任何更改都可能破坏这一点。
    因此,请仔细查看awk或perl中的答案,这些答案很快就会得到
    然后使用您最熟悉的语言/工具,例如您自己最了解的语言/工具

    $ sed 's/\(via [0-9.]*, \)[[:alnum:]:]*/\1/' file
    B*    0.0.0.0/0 [200/0] via 1.0.10.121,
                    [200/0] via 1.0.10.111,
          10.0.0.0/8 is variably subnetted, 159 subnets, 7 masks
    O N1     10.0.0.1/32 [210/21] via 172.18.10.27, , Vlan1503
    O N1     10.1.0.0/16 [210/21] via 172.18.10.51, , Vlan1506
    O N1     10.2.0.0/16 [210/21] via 172.18.10.59, , Vlan1507
    B        10.10.0.0/16 [200/0] via 0.0.0.0, , Null0
    B        10.186.14.0/24 [200/0] via 1.0.10.124,
                            [200/0] via 1.0.10.114,
    B        10.186.15.0/24 [200/0] via 1.0.10.124,
    O N2     10.192.32.0/21 [210/20] via 172.18.10.243, , Vlan1508
    O N2     10.192.40.0/21 [210/20] via 172.18.10.243, , Vlan1508
    B        10.193.0.0/24 [200/0] via 1.0.10.124,
                           [200/0] via 1.0.10.114,
    C        172.18.10.232/29 is directly connected, Vlan1589
    L        172.18.10.233/32 is directly connected, Vlan1589
    B        205.1.2.3/27 [200/21] via 1.0.30.5,
    B     205.3.2.1/24 [200/20] via 1.0.30.5,
    O N1     2.2.2.2 [110/2] via 192.168.0.2, , Vlan1500
    O N1     10.10.83.0/24 [210/21] via 172.18.10.27, , Vlan1503
    

    除了旧的、POSIX之前的sed之外,上述内容在任何sed中都可以使用,如果这是您所拥有的,那么只需将
    [:alnum://code>更改为
    [0-9a-z]

    如果路线的使用时间少于一天,它会是什么样子?还不到一个小时?谢谢你的快速回复!好问题,这里的输出显示了一条不到一小时的路线,格式完全不同。该死,我无法在评论中很好地设置输出格式,所以我要编辑我的帖子。可能两个小时前的路线有另一种格式,不是吗?sed-E可以使用吗?另一个很好的问题,我很抱歉没有想到这一点。看来我犯了一个错误,我编辑的第二条路线已经有48秒了。我相信一个小时前的路线是01:00:00。我有一个实验室在运行来测试这个,但我必须等一个小时。哇!那真是一句妙语!很酷,如果我没弄错的话,你是在匹配整行的语法,而不是仅仅搜索变化剧烈的时间戳,这显然不是我想到的。我刚刚在一个大约650条路线的大表上测试了您的解决方案,它非常有效!感谢您如此耐心地帮助我更好地描述我的问题:)关于年龄有一点语法假设;不必删除该行的其余部分。但正如您所发现的,语法假设远不够精确,无法真正匹配和删除年龄。总结的措辞很好,我现在在回答中使用了它。不客气!是的,我当时正把头撞在墙上,试图找出一种方法来精确匹配变化的时间戳。我喜欢你匹配一切的方式,除了时间戳:D这是一个很好的提醒,让你跳出框框思考,还有一些令人印象深刻的awk魔法。我将把你们的sed生产线调整到另一个供应商的设备上进行一些练习,再次感谢!
    $ sed 's/\(via [0-9.]*, \)[[:alnum:]:]*/\1/' file
    B*    0.0.0.0/0 [200/0] via 1.0.10.121,
                    [200/0] via 1.0.10.111,
          10.0.0.0/8 is variably subnetted, 159 subnets, 7 masks
    O N1     10.0.0.1/32 [210/21] via 172.18.10.27, , Vlan1503
    O N1     10.1.0.0/16 [210/21] via 172.18.10.51, , Vlan1506
    O N1     10.2.0.0/16 [210/21] via 172.18.10.59, , Vlan1507
    B        10.10.0.0/16 [200/0] via 0.0.0.0, , Null0
    B        10.186.14.0/24 [200/0] via 1.0.10.124,
                            [200/0] via 1.0.10.114,
    B        10.186.15.0/24 [200/0] via 1.0.10.124,
    O N2     10.192.32.0/21 [210/20] via 172.18.10.243, , Vlan1508
    O N2     10.192.40.0/21 [210/20] via 172.18.10.243, , Vlan1508
    B        10.193.0.0/24 [200/0] via 1.0.10.124,
                           [200/0] via 1.0.10.114,
    C        172.18.10.232/29 is directly connected, Vlan1589
    L        172.18.10.233/32 is directly connected, Vlan1589
    B        205.1.2.3/27 [200/21] via 1.0.30.5,
    B     205.3.2.1/24 [200/20] via 1.0.30.5,
    O N1     2.2.2.2 [110/2] via 192.168.0.2, , Vlan1500
    O N1     10.10.83.0/24 [210/21] via 172.18.10.27, , Vlan1503