在这个awk命令中应该设置什么'RS'

时间:2016-03-01 03:26:45

标签: linux awk

我正在使用awk从日志文件中删除有用的信息。这就是我的日志文件:

2016-02-19 20:18:46,861 115971,100126017,524,523,1,[144115198332971054]
2016-02-19 20:18:46,874 95496,100126019,5,5,0,[]
2016-02-19 20:18:46,883 115974,100126025,57,57,0,[]
2016-02-19 20:18:46,891 115975,100126026,4,4,0,[]
2016-02-19 20:18:46,918 115976,100126027,122,122,0,[]
2016-02-19 20:18:47,688 115978,100126029,11656,11641,15,[144115198334490817,144115197319238988,144115197291063350,144115198332904743,144115197318718547,144115197319714394,144115197306930902,144115197250548791,144115198320676757,14411519
7253880518,144115197289305237,144115198083289344,144115197319697491,144115198273784435,144115198081583082]
2016-02-19 20:18:47,731 99590,100126032,12,12,0,[]
2016-02-19 20:18:47,832 115982,100126034,1397,1396,1,[144115198273784435]
2016-02-19 20:18:47,849 106705,100126035,31,31,0,[]
2016-02-19 20:18:47,860 107469,100126036,16,16,0,[]
2016-02-19 20:18:47,927 115983,100126037,824,824,0,[]
2016-02-19 20:18:47,985 115985,100126039,564,564,0,[]
2016-02-19 20:18:48,048 115986,100126040,338,338,0,[]
2016-02-19 20:18:48,108 115987,100126041,259,259,0,[]
2016-02-19 20:18:48,187 115989,100126043,693,692,1,[144115198273784435]

我将","用于FS变量;我需要[]方括号之间的完整内容,因此我尝试将RS设置为"]"

awk  'BEGIN { FS=","; RS="]";}  { print $2 ,$3, $6 ,$7}' removed-apply.log.2016-02-19 

但结果是错误的:

861 115971 100126017 1 [144115198332971054]
874 95496 100126019 0 []
883 115974 100126025 0 []
891 115975 100126026 0 []
918 115976 100126027 0 []
688 115978 100126029 15 [144115198334490817
731 99590 100126032 0 []
832 115982 100126034 1 [144115198273784435]
849 106705 100126035 0 []
860 107469 100126036 0 []
927 115983 100126037 0 []
985 115985 100126039 0 []
048 115986 100126040 0 []
108 115987 100126041 0 []
187 115989 100126043 1 [144115198273784435]

似乎RS仍然是换行符。

2 个答案:

答案 0 :(得分:3)

更新:第二个想法,你可以使用输入字段分隔符regex(通过选项-F指定,转换为变量{ {1}}):

FS

请注意 awk -F ',\\[?|\\]' '{ print $2 ,$3, $6 ,$7 }' removed-apply.log.2016-02-19 个实例需要在正则表达式<正则表达式的上下文中生成跟随它们的字符 literal / em>的。例如,\通过\\[的初始字符串解析转换为文字\[,然后正则表达式解析作为awk,导致解释为 literal \[。简而言之: string [会产生正则表达式 ,\\[?|\\]

原始回答(已接受):

您的输入仍然明确面向行,因此没有理由更改输入记录分隔符,\[?|\]

相反,在两个步骤中解析每一行:

  • 使用RS最初将输入分解为 2 字段:FS之前和[之间。
    • 注意:下面使用的奇怪的正则表达式[...]是一个包含2个文字字符[][][...]的字符集(]);它在概念上等同于[
  • 然后,使用\[|\]将每个结果字段按split()拆分为存储在数组中的子字段:
,

答案 1 :(得分:1)

使用“]”作为RS似乎是朝错误方向迈出的一步。 (您如何区分由“[abc]”组成的输入文件与由“[abc”组成的输入文件?)

之间的区别

假设您想要的文本位于同一行的方括号之间,则以下内容可以处理您描述的输入类型:

grep '\[.*\]' | sed -e 's/^[^[]*\[\(.*\)\].*/\1/'

您可能需要根据要求的详细信息进行调整。将其翻译成awk也很容易。

如果您的要求比上述要求更复杂,请详细说明。