使用sed提取QueryString值

时间:2018-03-05 09:36:20

标签: regex bash sed

我在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/'

5 个答案:

答案 0 :(得分:3)

sed 解决方案:

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

输出:

647930229655
647930229656
647930229657
647930229658

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

$ grep -oP '(?<=&MSISDN=)\d+' file 
647930229655
647930229656
647930229657
647930229658

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

或使用sed

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

答案 3 :(得分:1)

关注简单sed可能对您有所帮助。

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

说明:

s/.*MSISDN=//s表示在当前行中将.*MSISDN=字符串替换为// NULL。

;半冒号告诉sed还有1个语句要执行。

s/&.*//g's/&.*//表示将&.*中的&替换为NULL的所有内容。

答案 4 :(得分:0)

您也可以将cut传递给cut

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