2016-10-11 72 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