2016-10-11 75 views
1

美好的一天開始,linux下的bash削減一行與某些字符串

IM使用Linux的bash命令提取每個SIP帳號的某些數據,並把它們彼此相鄰。

我有一個名爲$ peers的數組,我將所有1000 sips放入,現在我需要循環通過它們來設置每個SIP到它的useragent。

我迄今是

#! /bin/bash 

peers="$(asterisk -rx "sip show peers" | cut -f1 -d" " | cut -f1 -d"/" "=")" "= " asterisk -rx "sip show peer " $peer | cut -f2 -d"Useragent" 

for peer in $peers do 
echo $peers 
done 

#echo $peers 

我需要通過運行asterisk -rx "sip show peer 101"從行的集合,與「用戶代理」

我開始開始提取行,下面給我的結果

* Name  : 101 
    Description : 
    Secret  : <Set> 
    MD5Secret : <Not set> 
    Remote Secret: <Not set> 
    Context  : outgoing 
    Record On feature : automon 
    Record Off feature : automon 
    Subscr.Cont. : <Not set> 
    Language  : 
    Tonezone  : <Not set> 
    AMA flags : Unknown 
    Transfer mode: open 
    CallingPres : Presentation Allowed, Not Screened 
    Callgroup : 
    Pickupgroup : 
    Named Callgr : 
    Nam. Pickupgr: 
    MOH Suggest : 
    Mailbox  : 
    VM Extension : asterisk 
    LastMsgsSent : 0/0 
    Call limit : 0 
    Max forwards : 0 
    Dynamic  : Yes 
    Callerid  : "" <> 
    MaxCallBR : 384 kbps 
    Expire  : 23 
    Insecure  : no 
    Force rport : Yes 
    Symmetric RTP: Yes 
    ACL   : No 
    DirectMedACL : No 
    T.38 support : No 
    T.38 EC mode : Unknown 
    T.38 MaxDtgrm: -1 
    DirectMedia : Yes 
    PromiscRedir : No 
    User=Phone : No 
    Video Support: No 
    Text Support : No 
    Ign SDP ver : No 
    Trust RPID : No 
    Send RPID : No 
    Subscriptions: Yes 
    Overlap dial : Yes 
    DTMFmode  : rfc2833 
    Timer T1  : 500 
    Timer B  : 32000 
    ToHost  : 
    Addr->IP  : xxx.xxx.xxx.xxx:5060 
    Defaddr->IP : (null) 
    Prim.Transp. : UDP 
    Allowed.Trsp : UDP 
    Def. Username: 101 
    SIP Options : (none) 
    Codecs  : (gsm|ulaw|alaw|g729|g722) 
    Codec Order : (gsm:20,g722:20,g729:20,ulaw:20,alaw:20) 
    Auto-Framing : No 
    Status  : OK (9 ms) 
    Useragent : UniFi VoIP Phone 4.6.6.489 
    Reg. Contact : sip:[email protected]:5060;ob 
    Qualify Freq : 60000 ms 
    Keepalive : 0 ms 
    Sess-Timers : Accept 
    Sess-Refresh : uas 
    Sess-Expires : 1800 secs 
    Min-Sess  : 90 secs 
    RTP Engine : asterisk 
    Parkinglot : 
    Use Reason : No 
    Encryption : No 

現在我需要削減這部分Useragent : UniFi VoIP Phone 4.6.6.489

並將其顯示爲101 : UniFi VoIP Phone 4.6.6.489

任何幫助,將不勝感激

謝謝。那個最佳答案完美運作。這是我現在的解決方案。

peer="$(asterisk -rx "sip show peers" | cut -f1 -d" " | cut -f1 -d"/")" 


for peer in $peers do 

output= "$(asterisk -rx "sip show peer $peers" | sed -nE '/Useragent/ s/^[^:]+/101 /p')" 
echo $output 


done 

但目前仍處於給人的問題,我的問題是變量

+0

捕捉只是讓你可以'echo'它輸出所述部分是[無用使用'echo'](http://www.iki.fi/時代/ UNIX/award.html#回聲)。無論如何,除非特別要求shell對值執行空白標記化和通配符擴展,否則應該將該變量放在雙引號中。 – tripleee

回答

3

的循環利用sed:與Useragent

... | sed -nE '/Useragent/ s/^[^:]+/101 /p' 
  • /Useragent/匹配線(S)

  • s/^[^:]+/101 substi tutes從開始直至:(不包括)與101

+0

謝謝你,完美的作品:) –

+0

關於我的bash腳本,我在通過啜飲循環時遇到了一些麻煩,你會介意告訴我我的循環出了什麼問題嗎?我已經用新腳本更新了我的問題,因爲我已將它與您的答案包含在一起 –

+0

@AndreaVisnenzaAndy不知道您在'bash'變量聲明中所做的嘗試bu在'='周圍不能有任何空格。 DO:'output = $(asterisk -rx「sip show peer $ peers」| sed -nE'/Userragent/s/^[^:] +/101/p')' – heemayl