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