Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 日志文件的有效grep_Regex_Logging_Grep - Fatal编程技术网

Regex 日志文件的有效grep

Regex 日志文件的有效grep,regex,logging,grep,Regex,Logging,Grep,我有一个日志文件,其中有很多关于此格式的行: 10.87.113.12 - - [2019-12-09T11:41:07.197Z] "DELETE /page/sub1.php?id=alice HTTP/1.1" 401 275 "-" "alice/7.61.1" 10.87.113.12 - - [2019-12-09T11:41:07.197Z] "DELETE /page/sub1.php?id=alice HTTP/1.1" 401 275 "-" "alice/7.61.1" 1

我有一个日志文件,其中有很多关于此格式的行:

10.87.113.12 - - [2019-12-09T11:41:07.197Z] "DELETE /page/sub1.php?id=alice HTTP/1.1" 401 275 "-" "alice/7.61.1"
10.87.113.12 - - [2019-12-09T11:41:07.197Z] "DELETE /page/sub1.php?id=alice HTTP/1.1" 401 275 "-" "alice/7.61.1"
10.87.113.12 - - [2019-12-09T11:43:51.008Z] "POST /page/sub2.php?id=alice&jw_token=07e876afdc2245b53214fff0d4763730 HTTP/1.1" 200 275 "-" "alice/7.61.1"
我的目标很简单:我想输出Alice的jw_令牌,就这样

因此,我的逻辑是,我需要找到包含id=alice和状态码200的行,然后返回jw_token的值

我确实做到了这一点,但只是用了这条绝对怪异的线条:

$grep id=alice main.log | grep 200 | grep-on=.*sed s/*=///g | sed s/*$///g | uniq 07e876afdc2245b53214fff0d4763730 这看起来很可怕,并且可能会在很多事情上出现中断,例如,如果200碰巧出现在线路的其他任何地方。我知道grep-P本可以稍微清理一下,但不幸的是,这个标志在我的Mac上不可用

我还通过包括Python实现了这一点,如下所示:

cat analyzer.py 进口稀土 将打开的'main.log'作为f: 对于f中的行: 如果id=alice in line和200 in line:
printre.search'?请您尝试以下内容,如果您对awk没有问题,这对awk来说应该是一项简单的任务


请尝试以下方法:

grep "id=alice.* 200 " main.log | sed 's/.*jw_token=\([^ ]\{1,\}\).*/\1/' | uniq

您只需使用一个grep和sed命令即可实现这一点

grep -E 'id=alice&jw_token=.* HTTP\/1.1" 200' main.log|sed -E 's/.*id=alice&jw_token=([a-zA-Z0-9]+).*/\1/'|uniq

这里,第一部分grep-E'id=alice&jw_-token=.*HTTP\/1.1200'main.log将过滤掉所有没有alice和状态为200的行,下一部分sed-E's/*id=alice&jw_-token=[a-zA-Z0-9]+./\1/'将只捕获group1中的令牌并用令牌替换整行。

如果您对perl oneliner开放:

perl -ane '/id=alice&jw_token=([a-f0-9]+).+\b200\b/ && $h{$1}++;END{print"$_\n" for sort(keys %h)}' file.txt
07e876afdc2245b53214fff0d4763730
说明:


格雷普200怎么样?谢谢你,@RedCricket。这将修复其中一个断点。然而,它不会使代码变得更漂亮。仍然在寻找一些很棒的解决方案。在我看来很漂亮。情人眼里出西施你是否愿意调用python脚本?一个简短但>1行的python脚本可以根据您的需要解析日志,并且代码将比源代码中的grep/awk更清晰sh@MaxOP说有效OP说他们的grep没有-P标志。而cut无论如何都是多余的,\K[:xdigit:][]*可以处理that@oguzismail,是的,刚刚在GNU的情况下加上了grep,这就是为什么我第一次尝试是awk:现在让我把它删除grep一:好的。然而,OP希望选择HTTP响应代码为200的行,以过滤掉无效的jw_令牌。您发布的两个解决方案都忽略了that@oguzismail,谢谢你节省了时间,我现在改了,需要一杯咖啡:谢谢你,伙计:我把alice放在这个代码里的什么地方?现在它找到了几乎所有的行,并且返回了比jw_令牌更多的内容:``72744e82e257e1928ba4328727b0426d&page=549 d64cc42f98bb8314452514778f94a9cf&page=348 10cde18599fd5b7992d6e76b3d957f0c&id=z564s6trr 845BA55D44D3D474B286FC9478&id=id=D68RPHIJ6 A6ADA28A8A8112A857AB1CB1740ABC&id=8P5UI1PR``最后一段代码运行得很好。非常感谢。第一个会吐出大量的错误信息positives@genbatro:是的,我猜这就是为什么我添加了第二行,所以grep已经过滤掉了所有不需要的内容。这确实找到了相关的行,但打印了所有行,以及整行。我想要一个代币。谢谢你的回答@genbatro感谢您的反馈。我必须调整sed命令才能在MacOS上工作。你能测试一下我的更新代码吗?对不起打扰你了。很好用,谢谢。只需要对重复项进行排序并返回一个唯一的令牌。
perl -ane '/id=alice&jw_token=([a-f0-9]+).+\b200\b/ && $h{$1}++;END{print"$_\n" for sort(keys %h)}' file.txt
07e876afdc2245b53214fff0d4763730
/                           # regex delimiter
    id=alice&jw_token=      # literally
    ([a-f0-9]+)             # group 1, 1 or more hexa
    .+                      # 1 or more any character
    \b200\b                 # 200 surrounded with word boundaries
/                           # regex delimiter, you may use /i for case insensitive