尝试使用 Sed 和正则表达式从日志文件中获取数据

尝试使用 Sed 和正则表达式从日志文件中获取数据

您好,我在使用 sed -E 命令从日志文件中提取数据时遇到了困难。我发现正​​则表达式与我在 python 中使用的不同。

INFO [2020-05-10 17:37:34] [armada.gloge]  Username [109/15654]

我需要的数据是数字 109。我无法生成正则表达式来执行此操作。谢谢。

echo "Username [132" | sed -E '[^Username\s+]'

输出:

sed: -e expression #1, char 1: unknown command: `['

答案1

sed -E不期望正则表达式,它期望带有 sed 命令的 sed 脚本。一些 sed 命令使用正则表达式。您的脚本以 开头,[这不是 sed 命令,因此unknown command

您的任务可以通过一个s命令完成:

sed -E 's|.*\[([^/]*).*|\1|'

搜索模式是:

  • .*\[– 将所有内容都取到最后一个文字[(因为贪婪所以是最后一个*);.*\[您可以使用.*Username \[来查找[紧接着的Username,即使它不是最后一个;
  • ([^/]*)– 然后将/尽可能多的非-作为一个组;
  • .*– 然后休息一下。

由于.*在前面和.*结尾,整个模式将匹配整行,如果中间部分匹配任何内容。替换为\1,这意味着 定义的第一个(在我们的例子中是唯一的)捕获组()

不匹配的行将按原样打印。如果这不是您想要的,请指示sed仅在s成功后打印:

sed -E 's|.*\[([^/]*).*|\1|;t;d'

在哪里

  • t如果成功则分支sed到脚本末尾;默认s在脚本末尾打印;sed
  • dt仅在没有工作(意味着s没有执行替换)后才会达到,它会sed忘记当前行,读取下一行并重新开始脚本。

另一种方法是删除不包含的行Username [并仅处理剩下的行:

sed -E '/Username \[/ ! d
        s|.*\[([^/]*).*|\1|'

这里/Username \[/与 匹配Username [!否定,因此d仅对不包含 的行运行Username [。在这种情况下,您可以将其解释d为“删除该行”。


以防万一:你sed使用以下命令处理文件

sed … thefile
# or
<thefile sed …

相关内容