gpt4 book ai didi

linux - 在此 awk 命令中应将 'RS' 设置为什么

转载 作者:太空狗 更新时间:2023-10-29 11:42:49 24 4
gpt4 key购买 nike

我正在使用 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 仍然是换行符。

最佳答案

更新:再三考虑,您可以使用单个输入字段分隔符正则表达式(通过选项 -F 指定,它转换为变量 FS):

awk -F ',\\[?|\\]' '{ print $2 ,$3, $6 ,$7 }' removed-apply.log.2016-02-19

请注意,需要加倍 \ 实例以在 的上下文中将它们后面的字符生成为文字>正则表达式。例如,\\[ 通过 awk 的初始 string 解析变成文字 \[regex 解析然后被视为 \[,导致解释为 literal [。简而言之:string ,\\[?|\\] 结果为 regex ,\[?|\].


原始答案(已接受):

您的输入显然面向行,因此没有理由更改输入记录分隔符 RS

相反,分步解析每一行:

  • 使用 FS 最初将输入分成 2 个字段:在 [ 之前和 之间[...]
    • 注意:下面使用的奇怪的正则表达式[][]是一个包含2个文字字符的字符集([...]),][;它在概念上等同于 \[|\]
  • 然后,使用split() 将每个结果字段按 拆分为存储在数组 中的子字段:
awk '
BEGIN { FS="[][]" } # split into $1 (before "[") and $2 (between "[...]")
{
split($1, fa1, ",") # split $1 into subfields by "," and store in array fa1
split($2, fa2, ",") # split $2 into subfields by "," and store in array fa2
# Output fields of interest
print fa1[2], fa1[3], fa2[1], fa2[2]
}' removed-apply.log.2016-02-19

关于linux - 在此 awk 命令中应将 'RS' 设置为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35714111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com