[英]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.