使用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值的主要内容,如果未能解决你的问题,请参考以下文章