使用 awk 或 sed 命令使用多个定界符切割字符串

Cutting a string using multiple delimiters using the awk or sed commands

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

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

每行。

我想修改成csv文件,只包含两个phone数字,例如:

972526134661,972526134662

等等

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

虽然,基本上我想要做的是获取所有以 < 开头并以 > 结尾的字符串,然后获取 [=13= 之后的所有字符串] 分隔符。

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

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

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

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

正则表达式匹配以From开头的行,并捕获<sip:之后的两个数字。如果空格是可变的,您可能需要在这些地方添加 *

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

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

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

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

请注意,因为您的文件是 "generated",我们可以假定数据采用常规格式,并且预计 "short" 模式不会导致误命中。

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

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

对于你问题中的第一个样本,它产生了这个:

972526134661,972526134662

求最新(revision 8)版本,猜猜你想要什么:

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

产生这个:

from_number,972526134662

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

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