【问题标题】:Cutting a string using multiple delimiters using the awk or sed commands使用 awk 或 sed 命令使用多个分隔符剪切字符串
【发布时间】:2015-04-09 23:44:48
【问题描述】:

我正在使用 SIPP 服务器模拟器来验证来电。 我需要验证的是来电显示和拨打的数字。我已将此信息记录到一个文件中,该文件现在包含以下内容:

From: <sip:972526134661@server>;tag=60=.To: <sip:972526134662@server>}

在每一行。

我想要的是将其修改为仅包含两个电话号码的csv文件,如下所示:

972526134661,972526134662

等等

我尝试过使用awk -F 命令,但是我只能使用sip: 作为分隔符或@/ 作为分隔符。

虽然,基本上我想要做的是获取所有以&lt; 开头并以&gt; 结尾的字符串,然后获取所有遵循sip: 分隔符的字符串。

使用cut 命令也不是一个选项,因为我知道它不能使用字符串作为分隔符。

我想它应该很简单,但我还没有找到合适的东西来使用.. 非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: bash awk sed cut


    【解决方案1】:

    好吧,为了好玩,选择一些随机数据(从您的原始帖子中)并按照您最初的需要使用 awk -F

    请注意,由于您的文件是“生成的”,我们可以假设数据采用常规格式,而不是指望“短”模式会导致误点击。

    [g]awk -F'sip:|@' -v OFS="," '{print $2,$4}' yourlogfile
    

    它使用sip:@ 作为字段分隔符,通过交替运算符 |。如果需要,它可以很容易地扩展以允许更多的字符或字符串也用于分隔输入中的字段。内置变量 FS 可以包含这样的正则表达式/regexp。

    对于您问题中的第一个示例,它会产生以下结果:

    972526134661,972526134662
    

    对于最新(修订版 8)版本,并猜测您想要什么:

    [g]awk -F'sip:|@|to_number:' -v OFS="," '{print $2,$5}' yourlogfile
    

    产生这个:

    from_number,972526134662
    

    [g]awk 是因为我在我的机器上使用了 gawk,并且使用 awk 得到了相同的行为。

    @fedorqui 建议对样式进行轻微修改,以使用命令行选项 -v 设置输出字段分隔符的值(一个 AWK 内置变量,可以像任何其他变量一样使用 -v 进行修改)并用逗号分隔打印字段,以便在输出中将它们视为字段,而不是使用硬编码的“,”构建字符串并将其视为一个字段。

    【讨论】:

    • 不错!请注意,您还可以使用-v OFS="," 设置输出字段分隔符,这样您就不必在print 语句中对其进行硬编码。
    • @fedorqui 谢谢。更新。我很少做“命令行”awks,更喜欢-f他们,所以我通常会在BEGIN中有这些东西。
    • 没有区别。 awk -v OFS="," '...' 完全等同于 awk 'BEGIN{OFS=","}',无论您如何调用代码。
    • @fedorqui 是的,只是-v 在我的脑海中只是一个微弱的意识。我个人(几乎)总是将 awk 写入文件。我发现重新使用/再次查找更容易。因为这是一个“命令行”,所以最好有 -v 和字段,而不是我原来的。
    【解决方案2】:

    我建议使用 sed 来提取这两个数字:

    $ sed -n 's/^From: <sip:\([0-9]*\).*To: <sip:\([0-9]*\).*/\1,\2/p' file
    972526134661,972526134662
    

    正则表达式匹配以From 开头的行并捕获&lt;sip: 之后的两个数字。如果空格是可变的,您可能需要将* 添加到这些位置。

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式替换,只要格式保持不变(顺序始终为 From/To):

      sed -E "s/^.*sip:([0-9]+)@.*sip:([0-9]+)@.*$/\1,\2/"
      

      这不是一个非常具体或完美的解决方案,但在大多数情况下,这样的方法就足够了。

      【讨论】:

      • 显然您还没有测试您的解决方案 - 它在 s 命令末尾缺少 / 并使用扩展正则表达式,因此需要 -r(或 -E ) 切换才能工作。
      • 我为提交有点过早表示歉意,我正在手机上尝试一下
      • 谢谢,这很好用,只要格式没有改变,因为它是提前设置的,所以不应该。
      • 您也可以将 fromto 部分添加到模式中,这样当模式发生变化时它会“中断”
      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多