首页 > 解决方案 > 如何捕获文件头,然后对原始文件进行进一步的文本处理?

问题描述

我想捕获以下文件的前 8 行,然后捕获 NPU # 等于 7 或 3 且 NPU core 等于 1 的所有字段。

RP/0/RP0/CPU0:xxxxx#show controllers npu voq-usage interface all instance all location 0/0/CPU0
33144 Tue Jun  4 xxxx
33145 -------------------------------------------------------------------
33146 Node ID: 0/0/CPU0
33147 Intf         Intf     NPU NPU  PP   Sys   VOQ   Flow   VOQ    Port
33148 name         handle    #  core Port Port  base  base   port   speed
33149 (hex)                                     type
33150 ----------------------------------------------------------------------
33151 Hu0/0/2/1    210       0   1   21    21   1024   4152 local   100G
33152 Hu0/0/2/47   218       7   0    1   701   1032   4152 local   100G
33153 Hu0/0/2/46   220       7   0    5   705   1040   4216 local   100G
33154 Hu0/0/2/45   228       7   0    9   709   1048   4280 local   100G
33155 Hu0/0/2/44   230       3   1   17   717   1056   4152 local   100G

我可以使用以下不同的 awk 命令来做到这一点:

awk 'NR<9' filename.txt
awk '($4==7||$4==3) && $5==1' filename.txt

我可以就如何将这些 awk 语句加入到一起获得一些建议吗?或者甚至可能更优雅地实现这一目标的bash-ism?

谢谢,

标签: bashawksed

解决方案


我建议使用||运算符并将第二个条件分组:

awk 'NR<9 || (($4==7||$4==3) && $5==1)' filename.txt > newfilename.txt

查看在线演示

s="RP/0/RP0/CPU0:xxxxx#show controllers npu voq-usage interface all instance all location 0/0/CPU0
33144 Tue Jun  4 xxxx
33145 -------------------------------------------------------------------
33146 Node ID: 0/0/CPU0
33147 Intf         Intf     NPU NPU  PP   Sys   VOQ   Flow   VOQ    Port
33148 name         handle    #  core Port Port  base  base   port   speed
33149 (hex)                                     type
33150 ----------------------------------------------------------------------
33151 Hu0/0/2/1    210       0   1   21    21   1024   4152 local   100G
33152 Hu0/0/2/47   218       7   0    1   701   1032   4152 local   100G
33153 Hu0/0/2/46   220       7   0    5   705   1040   4216 local   100G
33154 Hu0/0/2/45   228       7   0    9   709   1048   4280 local   100G
33155 Hu0/0/2/44   230       3   1   17   717   1056   4152 local   100G"

awk 'NR<9 || (($4==7||$4==3) && $5==1)'  <<< "$s"

输出:

RP/0/RP0/CPU0:xxxxx#show controllers npu voq-usage interface all instance all location 0/0/CPU0
33144 Tue Jun  4 xxxx
33145 -------------------------------------------------------------------
33146 Node ID: 0/0/CPU0
33147 Intf         Intf     NPU NPU  PP   Sys   VOQ   Flow   VOQ    Port
33148 name         handle    #  core Port Port  base  base   port   speed
33149 (hex)                                     type
33150 ----------------------------------------------------------------------
33155 Hu0/0/2/44   230       3   1   17   717   1056   4152 local   100G

推荐阅读