使用sed提取QueryString值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用sed提取QueryString值相关的知识,希望对你有一定的参考价值。

我在apache访问日志中有以下几行

/sms/receiveHLRLookup?Ported=No&Status=Success&MSISDN=647930229655&blah
/sms/receiveHLRLookup?Ported=No&Status=Success&MSISDN=647930229656&blah
/sms/receiveHLRLookup?Ported=No&Status=Success&MSISDN=647930229657&blah
/sms/receiveHLRLookup?Ported=No&Status=Success&MSISDN=647930229658&blah

我想只提取MSISDN值,所以预期输出将是

647930229655
647930229656
647930229657
647930229658

我正在使用以下sed命令,但我不能让它停止在&捕获

sed 's/.*MSISDN=(.*)/1/'
答案

但解决的办法;

sed -E 's/.*&MSISDN=([^&]+).*/1/' file
  • & - 是URL语法中的键/值对分隔符,因此您应该依赖它
  • ([^&]+) - 第一个捕获的组,包含除&之外的任何字符序列
  • 1 - 对第一个被捕组的反向引用

输出:

647930229655
647930229656
647930229657
647930229658
另一答案

-o:表示只打印匹配的字符串而不是整行。 -P:启用pcre正则表达式。 K:意味着忽略左边的一切。但应该是实际输入字符串的一部分。 d:表示数字,+表示一个或多个数字。

grep -oP 'MSISDN=Kd+' input
647930229655
647930229656
647930229657
647930229658
另一答案

以下简单的sed可能会帮助你。

sed 's/.*MSISDN=//;s/&.*//'  Input_file

说明:

s/.*MSISDN=//s表示用当前行中的.*MSISDN= NULL替换//字符串。

;半冒号告诉sed还有1个声明要执行。

s/&.*//g's/&.*//意味着将&.*&替换为NULL。

另一答案
$ grep -oP '(?<=&MSISDN=)d+' file 
647930229655
647930229656
647930229657
647930229658

-o选项意味着只显示匹配的输出-P选项是为了启用PCRE(Perl Compatible Regex)(?<=regex)这是为了强制执行断言背后的正面看法。你可以通过here了解更多关于它们的信息。与正常的正则表达式不同,Lookarounds不会消耗任何字符。因此唯一匹配的输出你得到它d+是1位或更多位数。

或使用sed

$ sed -r 's/^.*MSISDN=([0-9]+).*$/1/' file 
647930229655
647930229656
647930229657
647930229658
另一答案

你也可以把cut送到cut

cut -d '&' -f3 Input_file |cut -d '=' -f2

以上是关于使用sed提取QueryString值的主要内容,如果未能解决你的问题,请参考以下文章

用sed提取json值

Android课程---Android Studio使用小技巧:提取方法代码片段

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

匹配文件中的字符串并使用 sed 或 awk 打印整个值

JS获取URL中参数值(QueryString)的4种方法

如何在 .NETCore 中修改 QueryString ?