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