使用 awk getline bash 从指定时间范围内的日志文件中提取数据

2024-02-26

我正在搜索解析日志文件并在此链接中找到了我需要的内容从日志文件中提取指定时间范围内的数据 https://stackoverflow.com/questions/7575267/extract-data-from-log-file-in-specified-range-of-time

但最有用的答案(由@Kent发布):

# this variable you could customize, important is convert to seconds. 
# e.g 5days=$((5*24*3600))
x=$((5*60))   #here we take 5 mins as example

# this line get the timestamp in seconds of last line of your logfile
last=$(tail -n1 logFile|awk -F'[][]' '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; print d;}' )

#this awk will give you lines you needs:
awk -F'[][]' -v last=$last -v x=$x '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; if (last-d<=x)print $0 }' logFile 

我认为错误在于"date +%s -d .... part

给出以下错误:

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file

在我在这里提问之前,我花了很多时间尝试解决,但没有找到任何解决方案。

该脚本将被调用crontab获取最后 1 分钟的日志行并计算一分钟内列出某个 ip 的次数,以便我可以检测它是否是攻击。这是另一项任务,希望专家能够帮助在同一问题中提供所需的代码。(我认为它可以在两行内解决)。


问题可能只是您没有引用 shell 变量。看:

$ foo='ab cd'

$ awk -v bar="$foo" 'BEGIN{print bar}'
ab cd

$ awk -v bar=$foo 'BEGIN{print bar}'
awk: fatal: cannot open file `BEGIN{print bar}' for reading (No such file or directory)

是的,我知道这是一个不同的错误消息 - 当您将 shell 变量不加引号时会发生什么,具体取决于变量的值、目录的内容等,其中一些非常糟糕,例如删除中的每个文件你的文件系统。

因此,引用您的变量:

-v last="$last" -v x="$x"

然后看看问题是否仍然存在。

顺便说一句,这是如何使用 GNU awk 和输入文件来真正解决您的原始问题http://pastebin.com/BXmS4zLn http://pastebin.com/BXmS4zLn:

$ cat tst.awk
BEGIN {
    ARGV[ARGC++] = ARGV[ARGC-1]

    mths = "JanFebMarAprMayJunJulAugSepOctNovDec"

    if (days)  { hours = days * 24  }
    if (hours) { mins  = hours * 60 }
    if (mins)  { secs  = mins * 60  }
    deltaSecs = secs
}

NR==FNR {
    nr2secs[NR] = mktime($6" "(match(mths,$5)+2)/3" "$4" "gensub(/:/," ","g",$7))
    next
}

nr2secs[FNR] >= (nr2secs[NR-FNR] - deltaSecs)

$ awk -v hours=1 -f tst.awk file
157.55.34.99 - -  06 Sep 2013 09:13:10 +0300  "GET /index.php HTTP/1.1" 200 16977 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
85.163.134.149 - -  06 Sep 2013 09:50:23 +0300  "GET /wap/wapicons/mnrwap.jpg HTTP/1.1" 200 1217 "http://mydomain.com/main.php" "Mozilla/5.0 (Linux; U; Android 4.1.2; en-gb; GT-I9082 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"
83.113.48.218 - -  06 Sep 2013 10:13:07 +0300  "GET /english/nicons/word.gif HTTP/1.1" 200 803 "http://mydomain.com/french/details.php?eid=127928&cid=18&fromval=1&frid=18" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)"

$ gawk -v mins=60 -f tst.awk file
157.55.34.99 - -  06 Sep 2013 09:13:10 +0300  "GET /index.php HTTP/1.1" 200 16977 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
85.163.134.149 - -  06 Sep 2013 09:50:23 +0300  "GET /wap/wapicons/mnrwap.jpg HTTP/1.1" 200 1217 "http://mydomain.com/main.php" "Mozilla/5.0 (Linux; U; Android 4.1.2; en-gb; GT-I9082 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"
83.113.48.218 - -  06 Sep 2013 10:13:07 +0300  "GET /english/nicons/word.gif HTTP/1.1" 200 803 "http://mydomain.com/french/details.php?eid=127928&cid=18&fromval=1&frid=18" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)"

$ gawk -v mins=20 -f tst.awk file
83.113.48.218 - -  06 Sep 2013 10:13:07 +0300  "GET /english/nicons/word.gif HTTP/1.1" 200 803 "http://mydomain.com/french/details.php?eid=127928&cid=18&fromval=1&frid=18" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)"

您可以指定 days= 或 hours= 或 mins= 或 secs= 变量,它会做正确的事情。

如果您只需要一个脚本来获取您的问题所指出的最后 1 分钟的日志行(现在?),并且希望看到一个单行代码来执行此操作:

$ gawk 'NR==FNR {nr2secs[++nr] = mktime($6" "(match("JanFebMarAprMayJunJulAugSepOctNovDec",$5)+2)/3" "$4" "gensub(/:/," ","g",$7)); next} nr2secs[FNR] >= (nr2secs[nr] - 60)' file file
83.113.48.218 - -  06 Sep 2013 10:13:07 +0300  "GET /english/nicons/word.gif HTTP/1.1" 200 803 "http://mydomain.com/french/details.php?eid=127928&cid=18&fromval=1&frid=18" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 awk getline bash 从指定时间范围内的日志文件中提取数据 的相关文章

随机推荐

  • SSL 证书不起作用 - “无起始行”错误 - Apache2 Ubuntu 16.04.1

    我们正在办公室设置一个新的子域 并使用我们拥有的通配符 SSL 证书 我已经创建了我的密钥和 csr 文件 然后我发送到 csr 文件以获取我们现在拥有的 cer 文件 我将发布我进一步运行的命令 然后 在为我们的新域使用 a2ensite
  • 理解正则表达式 if then 语句

    所以我不确定我是否理解这是如何工作的并且想要a simple explanation to how they work是全部 我可能还差得很远 A pure regex solution is required and I don t kn
  • VBA 中的索引 (Access 2003) - 字段关联

    基于 Microsoft Access 如何知道为索引字段集合创建的字段与 TableDef 字段集合中的等效字段关联 Even in 此 Microsoft 支持页面 https support microsoft com en us k
  • 复制 DOM 元素及其事件在变量中 (jQuery)

    我想复制变量中的 DOM 元素 所以我这样做了 var before someid html 然后我的脚本在这个 someid DOM 中做了很多事情 完成后我像以前一样恢复了 DOM someid html 之前 这工作正常 但问题是我在
  • 响应使浏览器不执行任何操作 - 这可能吗?

    是否有可能做出这样的 HTTP 响应 浏览器会忽略它并继续显示先前显示的页面 我的意思是以下场景 a 用户点击某物 b 一些 POST 发送到服务器 或 GET 但我们还是使用 POST 因为更有趣 c 服务器由于某种原因决定此时不想发送回
  • Python 命令行(参数太少)

    我的 python 系统调用有问题 我已经设置了 python 路径和路径文本 这些命令适用于我的计算机 run py python runWithParamater py parameterExample txt 但如果我跑 runWit
  • gae 错误:AttributeError:“NoneType”对象没有属性“user_is_member”

    class Thread db Model members db StringListProperty def user is member self user return str user in self members and thr
  • 使用 AWS Elastic LoadBalancer 公开 kubernetes 应用程序

    我创建了一个内部 AWS 弹性应用程序负载均衡器 并在 AWS 控制台中将其状态显示为活动 请注意 我使用 jenkins 作业创建了此 ALB 并且在该作业中我指定了我的 AWS EC2 实例服务器 该服务器配置为我的 kubernete
  • Cmake target_link_libraries 未链接我的库

    我将开始声明我在 Cmake 问题上几乎完全愚蠢 我有以下内容CMakeLists txt对于 Kdevelop 4 1 项目 project uart find package KDE4 REQUIRED include KDE4Defa
  • PCL:可视化点云

    我正在尝试使用可视化点云PCL http pointclouds org 云浏览器 问题是我对 C 很陌生 我找到了两个教程first https pcl readthedocs io projects tutorials en lates
  • 在尝试 Android 编程之前我应该​​学多少 Java? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我一直在寻找Android的初学者学习书籍 当然发现我应该先学习Java 所以我开始学习 Java 现在我对对象 类 继承 接口非常熟悉 并且刚
  • 通过 C# Graphics 绘制“透明”文本,但在某种程度上它将绘制的文本变为“缺失”,因此它在结果图像中是透明的

    我希望在 DC 上绘制一个字符串 图形 我正在使用 C 但我希望将绘制的文本从图像中 删除 以便剩下的本质上是文本的剪切 如果我用透明画笔绘制绳索 显然什么都不会发生 有没有一种方法可以绘制类似的东西 或者我是否需要使用 2 个 DC 和
  • Pyopengl 镶嵌多边形

    我有以下形式的多边形 1 2 2 4 3 4 5 6 我需要镶嵌来绘制它们 但是 glutes 太复杂了 Opengl 无法处理凸多边形 我想我需要类似的东西 http www math uiuc edu gfrancis illimath
  • 如何为单个文件启用 ARC

    我想将使用 ARC 编写的单个 Objective C 类引入旧项目中 互联网提供了许多关于如何为项目启用 ARC 然后为单个文件禁用它的参考 但我想做相反的事情 我想保持项目原样 即使用手动引用计数 然后仅为新文件启用 ARC 我的搜索在
  • 为什么 Gitlab-CI 在下一阶段删除工件?

    指定依赖关系后 Gitlab CI当进入下一阶段时 仍然会从工作目录中删除工件 我已经尝试了该代码的所有不同变体 我认为这些变体应该有效 但没有成功 此外 我已经阅读了几个小时但尚未成功 亚搏体育实验室11 6 0 stages build
  • mef 中的组合容器所持有的类的实例

    据我了解 MEF CompositionContainer 创建并保留类的实例 我不知道在什么情况下 CompositionContainer 的内部会有一个类实例 任何人都可以列出对 CompositionContainer 执行的操作或
  • C++ 相当于代数数据类型?

    假设我有这个 Haskell 代码 data RigidBody RigidBody Vector3 Vector3 Float Shape position velocity mass and shape data Shape Ball
  • WEKA 工具包中的隐马尔可夫模型相当于什么?

    我需要对来自由 8 个加速度计组成的传感器网络的数据流进行分类 每个加速度计都会给我一个 X Y 和 Z 值 因此 在每个样本中 我有 8 x 3 24 个加速度值 我的采样频率约为 30 Hz 执行时间约为 0 5 秒 起初我想为此使用隐
  • 如何使用反射改变属性值

    是否可以使用反射来更改类的属性值 以下是我的课程 public class LoggerManager private static LoggerManager instance new LoggerManager private Logg
  • 使用 awk getline bash 从指定时间范围内的日志文件中提取数据

    我正在搜索解析日志文件并在此链接中找到了我需要的内容从日志文件中提取指定时间范围内的数据 https stackoverflow com questions 7575267 extract data from log file in spe