AWK-匹配多个图案并在一行中打印结果

AWK-匹配多个图案并在一行中打印结果,awk,Awk,使用我有限的脚本知识。。我编写了一个expect脚本,用于在特定设备上运行一些命令。下面是输出,它从所有设备保存到一个文件中,我刚刚列出了两个设备作为示例 Current State : Active Router1slot1# showstats Active stats : 31 Active stats1 : 47 Router1slot1# exit Current State : Standby Router1slo

使用我有限的脚本知识。。我编写了一个expect脚本,用于在特定设备上运行一些命令。下面是输出,它从所有设备保存到一个文件中,我刚刚列出了两个设备作为示例

  Current State  : Active
Router1slot1# showstats
  Active  stats             : 31
  Active  stats1            : 47
Router1slot1# exit
  Current State  : Standby
Router1slot2# showstats
  Active  stats             : 59
  Active  stats1            : 56
Router1slot2# exit
我想要的是从输出中获取一些值,并将它们显示在行中,以,:

Router1slot1,Active,31,47
Router1slot2,Standby,59,56
我更接近我想要的,使用:

cat switch.log | awk '/# show/ {print substr($1,1)} /State  :/ {print substr($4,1)} /: / {print substr($5,1)}' >> awk.csv

Output:

Active

Router1slot1#
31
47
Standby

Router1slot2#
59
56
在这里,我尝试了不同的选项来将行转换为列,但似乎不起作用。输出类似于:

56uter1slot2#59
有没有更有效的方法来获取所需的格式?

试试这个-

awk -F':' '{ORS=(NR%5==0?RS:FS)}1' f|awk -F'[:# ]+' '{print $5,$4,$9,$12}' OFS=,
Router1slot1,Active,31,47
Router1slot2,Standby,59,56
试试这个-

awk -F':' '{ORS=(NR%5==0?RS:FS)}1' f|awk -F'[:# ]+' '{print $5,$4,$9,$12}' OFS=,
Router1slot1,Active,31,47
Router1slot2,Standby,59,56

假设没有任何空行,使用下面给定的数据应该是可行的

输入

输出

解释


假设没有任何空行,使用下面给定的数据应该是可行的

输入

输出

解释

这将把文本分成以exit分隔的记录,然后根据需要打印所选列。 gsub将从插槽编号字段中删除磅符号。 长度$0用于从结果中删除空白行

这将把文本分成以exit分隔的记录,然后根据需要打印所选列。 gsub将从插槽编号字段中删除磅符号。
长度$0用于从结果中删除空白行

这是非常有用的,谢谢!如果我在每次Router1slotx退出后都有一个空行,有没有办法让它工作呢?@dxxbstu:把{s=修改成NF{s=这很有用,谢谢!如果我在每次Router1slotx退出后都有一个空行,有没有办法让它工作呢?@dxxbstu:把{s=修改成NF{s=Hi,以下任何一个答案对你有帮助吗?如果有,请在答案旁边勾选正确的符号来接受/向上投票。如果没有帮助,请解释预期结果。Hi,以下任何一个答案对你有帮助吗?如果有,请在答案旁边勾选正确的符号来接受/向上投票。I如果他们没有帮助,请解释预期结果。
$ awk -F'[#:]' -v OFS=, '/exit/{print r,s; r=s=""; next}/showstats/{r=$1;next}{s=(s?s OFS:"")$2}' file
Router1slot1, Active, 31, 47
Router1slot2, Standby, 59, 56
awk -F'[#:]' -v OFS=, '             # call awk set and input and ouptut field sep
    /exit/{                         # if exit word found in record
            print r,s;              # print variable r, and s
            r=s="";                 # set variable r and s to null
            next                    # stop processing go to next line
    }
    /showstats/{                    # if showstats found
            r=$1;                   # copy first column to variable r
            next                    # stop processing go to next line
   }
   {
      s=(s?s OFS:"")$2              # variable s contains 2nd field of each line 
                                    # (which is not skipped above using next), 
                                    # if s was set before then concatenate
                                    # s with current record 2nd field, 
                                    # where separator being OFS between 
                                    # them (OFS=output field separator)
   }' file 
awk  ' BEGIN{RS="# exit";OFS=","}{$1=$1} length($0){gsub(/#/,"",$5);print $5,$4,$10,$14}' input
Router1slot1,Active,31,47
Router1slot2,Standby,59,56