【问题标题】:Extract QueryString value using sed使用 sed 提取 QueryString 值
【发布时间】:2018-03-06 14:08:00
【问题描述】:

我在 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 's/.*MSISDN=\([0-9]*\).*/\1/'
  • .* 是贪婪的,它会在尝试尊重整个正则表达式的同时尝试尽可能多地匹配......你必须找到一种方法来告诉它需要在 @987654328 之前停止@... 取决于单个/多个字符,您需要不同的方法来处理它.. 甚至是具有 sed 所不具备的功能的工具,例如环视。stackoverflow.com/questions/22937618/… 可能会有所帮助

标签: regex bash sed


【解决方案1】:

sed解决方案:

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

输出:

647930229655
647930229656
647930229657
647930229658

【讨论】:

  • @ManseUK,看我的解释
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    遵循简单的sed 可能会对您有所帮助。

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

    解释:

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

    ; 分号告诉sed 还有 1 条语句要执行。

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

    【讨论】:

      【解决方案4】:
      $ grep -oP '(?<=&MSISDN=)\d+' file 
      647930229655
      647930229656
      647930229657
      647930229658
      

      -o 选项旨在仅显示匹配的输出 -P 选项用于启用 PCRE(Perl 兼容正则表达式) (?&lt;=regex) 这是在断言背后强制执行积极的看法。您可以通过here 了解更多关于它们的信息。与普通正则表达式不同,环视在匹配时不消耗任何字符。因此,您得到的唯一匹配输出是\d+,它是一位或多位数字。

      或使用sed:

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

      【讨论】:

      • @ManseUK 添加了一些解释
      【解决方案5】:

      您也可以通过管道将cut 传递给cut

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

      【讨论】:

        猜你喜欢
        • 2019-08-31
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多