AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 751665
Accepted
achhainsan
achhainsan
Asked: 2023-07-17 16:30:02 +0800 CST2023-07-17 16:30:02 +0800 CST 2023-07-17 16:30:02 +0800 CST

选择日志文件中两个时间戳之间的所有内容

  • 772
awk '/10:..:/, /13:..:/' server.log > /tmp/awktmp

我按照有人给我的命令尝试了这个命令。它对我来说可以找到上午 10:00 到下午 13:00 之间的日志,但我不完全理解它。

如果您有一个优雅的解决方案,请告诉我。请记住,远程服务器很小,并且没有高级实用程序。

我在这里不明白的是'/10:..:/, /13:..:/'

  • 我理解10:..意思10是 和:完全匹配 2 位数字。
  • 但另一个是什么:意思呢?

我想正斜杠是用来放置正则表达式的,就像我们在 JavaScript 正则表达式中所做的那样。我对此不是100%确定。

更新1:

时间位于第二列,格式为HH:MM:SS

更新2:

sed -n -e '/8:..:../,/9:..:../p' application.log > /tmp/sedtmp

我尝试了这个,但这也显示了来自 的日志07:57:47。

更新3

日志并不总是在每一行中包含时间戳。有些行根本不包含任何时间戳。你是如何克服这个问题的?我愚蠢地使用了 awk,并且错过了所有没有时间价值的行。有办法避免这个问题吗?

这就是我的意思。

2023-08-07 09:20:35 0123456789 INFO  CustomerLogoutResource:95 - Entering logout api.
2023-08-07 09:20:35 0123456789 ERROR AppExceptionMapper:87 - Exception has been thrown by container
2023-08-07 09:20:35 0123456789 ERROR AppExceptionMapper:555 - Unchecked Exception
java.lang.NullPointerException
    at NullPointerExceptionExample.printLength(NullPointerExceptionExample.java:3)
    at NullPointerExceptionExample.main(NullPointerExceptionExample.java:8)
regular-expression
  • 4 4 个回答
  • 843 Views

4 个回答

  • Voted
  1. Paul_Pedant
    2023-07-17T16:54:31+08:002023-07-17T16:54:31+08:00

    该模式/10:..:/匹配数字 10、两个分隔符:以及它们之间的任意两个字符。因此它将匹配一个时间(输入行内的任何位置),例如10:35:22。但它也会匹配包含 的行This10:ZZ:Camels,因此这不是一个很好的测试。

    更好的模式可能是/10:[0-5][0-9]:[0-5][0-9]/,它检查分钟和秒是否在 00-59 范围内。但检查时间是否在特定字段中,或者当时是否有空格,或者(包括)接近记录的开头也可能会有所帮助。您可以发布一些示例输入行,以便我们更好地了解需要什么。

    用逗号分隔两个模式会在检测到第一个模式时“打开”匹配,而在检测到第二个模式时“关闭”匹配。它将匹配这些事件之间的所有行(包括),即使它们根本不包含日期。

    这与单一模式非常不同/1[0-2]:[0-5][0-9]:[0-5][0-9]/,单一模式只匹配 10:00:00 到 12:59:59 之间的各个行,无论它们碰巧是什么顺序。

    • 8
  2. Best Answer
    Stéphane Chazelas
    2023-07-17T17:36:17+08:002023-07-17T17:36:17+08:00

    如果 10:00 到 11:00 之间没有登录,这种方法无法找到 to 的行,并且11:00如果13:00 到 14:00 之间没有登录,则将报告之后的所有行(并且至少有10 到 11 之间的一个)。13:0014:00

    对于这种事情,最好对时间与边界进行词法比较。

    例如,如果时间在第三个字段中:

    awk '$3 >= "10:00:00" && $3 < "13:00:00"'
    

    如果您不知道时间在队列中的哪个位置,您可以这样做:

    perl -lne 'print if /\b\d\d:\d\d:\d\d\b/ &&
                          $& ge "10:00:00" &&
                          $& lt "13:00:00"'
    

    或者:

    LC_ALL=C awk 'match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) && \
                    (t = substr($0, RSTART, 8)) >= "10:00:00" && \
                    t < "13:00:00"'
    

    这些报告了在该范围内具有时间戳的行。如果带有时间戳的行之间有没有时间戳的行,并且您希望报告它们,则可以使用beginning-condition, end-condition {action}问题中的方法,但再次使用比较而不是正则表达式匹配,或者手动进行状态切换,以继续排除上限:

    LC_ALL=C awk -v beg=10:00:00 -v end=13:00:00 '
      match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) {
        t = substr($0, RSTART, 8)
        if (t >= end) selected = 0
        else if (t >= beg) selected = 1
      }
      selected'
    
    • 8
  3. Olivier Dulac
    2023-07-17T17:16:59+08:002023-07-17T17:16:59+08:00

    awk 模式:

    /regA/,/regB/
    

    从匹配 regA 的第一行到匹配 regB 的第一行都为 true。和往常一样,当某些内容与表达式匹配时:如果表达式后面没有任何内容{ actions }来精确说明匹配时要执行的操作,则默认操作是:打印表达式为 true 的行。

    现在他们选择了:

    /10:..:/, /13:..:/
    

    更加确定您匹配 10:mm:ss 而不是 hh:10:ss。(他们通过假设任何时间引用都是 : hh:mm:ss 来做到这一点,并且小时之前没有“:”......这并不总是正确的,具体取决于所使用的日期格式。正如所说在评论中,它也可以匹配其他东西。

    如果您知道行的开头始终是:

    YYYY-MM-DDThh:mm:ss+hh:mm 
    # For exemple:
    # 2023-07-17T11:14:02+02:00 , which is following internationnal recommendations
    # of displaying date and time (and timezone)
    

    您可以更紧密地匹配:

    /^2023-07-17T10:/,/^2023-07-17T13:/
    

    并确保仅从行的开头 (^) 开始匹配,而不是从行中可能出现的任何位置进行匹配。

    • 1
  4. varsock
    2023-07-18T23:30:47+08:002023-07-18T23:30:47+08:00

    这是一个可能的解决方案,它选择日志文件中两个时间戳之间的日志。此脚本假定日志文件具有以空格分隔的列,并且第二列包含格式为 的时间戳HH:MM:SS。可能不是最优雅的,但至少是清晰的。

    awk -F" " '$2 >= "09:00:00" && $2 <= "12:00:00"' server.log
    
    • -F" "将字段分隔符设置为空格字符。
    • $2指输入文件每行中的第二个字段(在这种情况下,字段之间用空格分隔)。
    • >= "09:00:00"检查第二个字段的值是否大于或等于“09:00:00”。
    • &&组合条件的逻辑运算符。意思是“和”
    • $2 <= "12:00:00"检查第二个字段的值是否小于或等于“12:00:00”。
    • sever.log是你的输入文件

    方案验证

    对于server.log看起来像这样的:

    2023-07-18 08:55:32 - Log entry 1
    2023-07-18 09:10:15 - Log entry 2
    2023-07-18 10:30:47 - Log entry 3
    2023-07-18 11:45:02 - Log entry 4
    2023-07-18 12:05:21 - Log entry 5
    2023-07-18 13:20:33 - Log entry 6
    

    输出:

    [get@me test]$ awk -F" " '$2 >= "09:00:00" && $2 <= "12:00:00"' server.log
    2023-07-18 09:10:15 - Log entry 2
    2023-07-18 10:30:47 - Log entry 3
    2023-07-18 11:45:02 - Log entry 4
    
    • 1

相关问题

  • 如何在匹配后删除几个字符?

  • 使用 POSIX 工具正确处理带有 BOM 的 Unicode 文件

  • 为什么正则表达式与 sed 命令的输入不匹配 [重复]

  • 使用特殊字符转换密码以与期望脚本一起使用

  • 更少:使用 AND 的多个过滤条件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve