您好,我在使用 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
d
t
仅在没有工作(意味着s
没有执行替换)后才会达到,它会sed
忘记当前行,读取下一行并重新开始脚本。
另一种方法是删除不包含的行Username [
并仅处理剩下的行:
sed -E '/Username \[/ ! d
s|.*\[([^/]*).*|\1|'
这里/Username \[/
与 匹配Username [
,!
否定,因此d
仅对不包含 的行运行Username [
。在这种情况下,您可以将其解释d
为“删除该行”。
以防万一:你sed
使用以下命令处理文件
sed … thefile
# or
<thefile sed …