我正在使用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
仍然是换行符。
答案 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也很容易。
如果您的要求比上述要求更复杂,请详细说明。