使用awk

时间:2018-06-08 11:54:32

标签: shell awk gsub

下面我试图仅从msg列中删除逗号。

输入文件(" abc.txt" 有多个条目如下):

alert tcp any any -> any [10,112,34] (msg:"Its an Test, Rule"; reference:url,view/Main; sid:1234; rev:1;)

预期产出:

alert tcp any any -> any [10,112,34] (msg:"Its an Test Rule"; reference:url,view/Main; sid:1234; rev:1;)

这是我尝试过使用awk:

awk -F ';' '{for(i=1;i<=NF;i++){if(match($i,"msg:")>0){split($i, array, "\"");tmessage=array[2];gsub("[',']","",tmessage);message=tmessage; }}print message'} abc.txt

2 个答案:

答案 0 :(得分:0)

请您试着跟随并告诉我这是否对您有帮助。

awk '{for(i=1;i<=NF;i++){if($i~/msg:/){sub(/,$/,"",$(i+2))}}} 1'  Input_file

答案 1 :(得分:0)

使用awk重写字段的问题是修改后的行的输出将由OFS进行字段分隔,这是静态的。

解决这个问题的方法是避免处理字段,只需处理$0上的字符串替换。您可以手动拼接线的各个部分,如下所示:

awk '{x=index($0,"msg:"); y=index(substr($0,x),";"); s=substr($0,x,y); gsub(/,/,"",s); print substr($0,1,x-1) s substr($0,x+y)}' input.txt

或者说明了更容易阅读:

{
  x=index($0,"msg:")                     # find the offset of the interesting bit
  y=index(substr($0,x),";")              # find the length of that bit
  s=substr($0,x,y)                       # clip the bit
  gsub(/,/,"",s)                         # replace commas,
  print substr($0,1,x-1) s substr($0,x+y)  # print the result.
}