Заменить столбец после выполнения действий с помощью awk - PullRequest
0 голосов
/ 08 июня 2018

Ниже я пытаюсь удалить запятую только из столбца сообщений.

Входной файл ( "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 голосов
/ 08 июня 2018

Проблема с тем, что 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.
}
0 голосов
/ 08 июня 2018

Не могли бы вы попробовать и сообщите мне, поможет ли это вам.

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