使用sed提取QueryString值

问题描述 投票:1回答:5

我在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/'
regex bash sed
5个回答
3
投票

但解决的办法;

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

输出:

647930229655
647930229656
647930229657
647930229658

2
投票

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

grep -oP 'MSISDN=\K\d+' input
647930229655
647930229656
647930229657
647930229658

1
投票

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

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

说明:

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

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

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


1
投票
$ 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

0
投票

你也可以把cut送到cut

cut -d '&' -f3 Input_file |cut -d '=' -f2
© www.soinside.com 2019 - 2024. All rights reserved.