簡體   English   中英

使用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文件,如下所示:

972526134661,972526134662

等等。

我嘗試過使用awk -F命令,但之后我只能使用sip:作為分隔符或@/作為分隔符。

雖然,基本上我想要做的是獲取所有以<<結尾>開頭的字符串,然后獲取sip: delimiter后面的所有字符串。

使用cut命令也不是一個選項,因為我知道它不能使用字符串作為分隔符。

我想它應該非常簡單,但我找不到合適的東西..請感謝幫助,謝謝!

好的,為了好玩,從原始帖子中挑選一些隨機數據並使用你原來想要的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像任何其他變量一樣修改)並分離使用逗號打印字段,以便在輸出中將它們視為字段,而不是使用硬編碼“,”構建字符串,並將其視為一個字段。

我建議使用sed來提取這兩個數字:

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

正則表達式匹配以From開頭的行,並在<sip:之后捕獲兩個數字。 如果空格是可變的,您可能希望將*添加到這些位置。

您可以使用正則表達式替換,只要格式保持不變(順序始終為From / To):

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

這不是一個非常具體或完美的解決方案,但在大多數情況下,這樣的方法就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM