使用awk或sed命令使用多个分隔符剪切字符串

时间:2015-04-09 10:00:51

标签: bash awk sed cut

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

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

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

972526134661,972526134662

等等。

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

虽然,基本上我想要做的是获取以<开头并以>结尾的所有字符串,然后获取sip:分隔符后面的所有字符串。

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

我想它应该非常简单,但我找不到合适的东西......请感谢帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

好的,为了好玩,从您原来的帖子中挑选一些随机数据,并按照您原来想要的方式使用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像任何其他变量一样修改)的样式轻微修改并使用逗号分隔打印字段,以便在输出中将它们视为字段,而不是使用硬编码的“,”构建字符串,并将其视为一个字段。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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