用定界符解析文本文件,并使用R输出多个文件

问题描述 投票:2回答:2

我正在尝试将服务器日志分解为多个文件,以便可以对它们运行一些指标。我有这个cronjob,它在每个月的第一天在我的服务器日志中添加一个字符串和一个时间戳,该字符串看起来像是“ 2020年3月1日每月断点”。我的想法是,可以通过此行定界符将这个大型服务器日志文件分解为多个日志文件,然后在每个文件上运行一些指标。我正在尝试编写一个脚本,该脚本将为我创建这些输出文件,但我为此感到困惑。到目前为止,我可以读取文件并循环浏览并找到定界符,但是我不确定解决此类问题的最佳方法,也许我不应该使用R,还有更简单的方法吗?

# server log
serverLog <- "server-out.log"

# Process File 
conn <- file( serverLog ,open="r")
linn <-readLines(conn)
for (i in 1:length(linn)){
  print( linn[i] )
  test <- grepl(  "Monthly", linn[i] )
  # print( paste("test: ", test, sep="" ) )
  if( test ) {
    print( "Found Monthly Breakpoint")
  }
}
close(conn)

# Example of the server-out.log file 

[0mGET /notifications [36m304 [0m9.439 ms - -[0m
[0mGET /user/status [36m304 [0m2.137 ms - -[0m
[0mGET /user/status [36m304 [0m5.675 ms - -[0m
[0mPOST /user/login [32m200 [0m19.960 ms - 30[0m
[0mGET /user/status [36m304 [0m9.518 ms - -[0m
[0mGET /user/status [32m200 [0m2.364 ms - 16[0m
[0mGET /user/status [36m304 [0m1.396 ms - -[0m
[0mGET /user/status [36m304 [0m1.087 ms - -[0m
[0mPOST /user/login [32m200 [0m300.214 ms - 30[0m
[0mGET /user/status [36m304 [0m4.374 ms - -[0m
[0mGET /localUser [32m200 [0m2.260 ms - 1045[0m

 Monthly Breakpoint, March 1 2020

[0mGET /user/status [32m200 [0m5.284 ms - 16[0m
[0mGET /user/status [36m304 [0m2.101 ms - -[0m
[0mGET /users [32m200 [0m2.387 ms - 36[0m
[0mGET /notifications [32m200 [0m30.395 ms - 2624[0m
[0mGET /user/status [36m304 [0m2.172 ms - -[0m
[0mGET /user/status [36m304 [0m1.424 ms - -[0m
[0mGET /user/status [36m304 [0m2.074 ms - -[0m
[0mGET /user/status [36m304 [0m0.920 ms - -[0m
[0mGET /users [36m304 [0m2.471 ms - -[0m
[0mGET /notifications [36m304 [0m8.416 ms - -[0m
[0mGET /user/status [36m304 [0m1.757 ms - -[0m
[0mGET /user/status [36m304 [0m1.114 ms - -[0m
[0mGET /favicon.ico [33m404 [0m2.218 ms - 150[0m
[0mGET /user/status [36m304 [0m2.003 ms - -[0m
[0mPOST /user/login [32m200 [0m175.473 ms - 30[0m
[0mGET /user/status [36m304 [0m3.893 ms - -[0m
  • 更新我尝试使用csplit,因为它听起来像是解决此问题的不错的选择,但我也无法正常工作..您能提供一个示例吗?
csplit -z server-out.min /Monthly/ '{*}'

csplit: illegal option -- z
usage: csplit [-ks] [-f prefix] [-n number] file args ...
r parsing text-parsing rscript
2个回答
0
投票

可能使用某些UNIX命令是最“自然的”,awkcsplit将是work in that regard


0
投票

这不是最优雅的答案,但这为我提供了我所需要的。我将尝试其他答案,将数据保留在R环境中是个好主意,这样我就可以运行所有指标而无需读取不必要的文件。谢谢@Till

© www.soinside.com 2019 - 2024. All rights reserved.