让我解释一下我要做什么。我试图在两个匹配模式之间提取一个键,并从命令输出(而不是文件(中删除所有内容,并将其放入变量中以供进一步使用。
asterisk -r -x "sip show peer 2030"
输出以下文本
-------truncated and given dummy keys -----
Prim.Transp. : UDP
Allowed.Trsp : UDP,TCP
Def. Username: 2030
SIP Options : (none)
Codecs : (ulaw|alaw|g729)
Auto-Framing : No
Status : OK (650 ms)
Useragent : LinphonephoneiOS/1.0 (Linphone’s iPhone) LinphoneSDK/4.4.0 Reg. Contact : sip:2030@192.168.10.246:57109;pn-provider=apns.dev;pn-prid=9D0C98263E98EE1E282516D585C298BA3915398117C4C30CD3FD352BEEBB7581:remote&2CA57031CAA11360A09B9F37A13DE83CB337BF860352FSAFD7E9B444E5DB673B:voip;pn-param=ABCD1234.org.linphone.linphone.remote&voip;pn-msg-str=IM_MSG;pn-call-str=IC_MSG;pn-groupchat-str=GC_MSG;pn-call-snd=notes_of_the_optimistic.caf;pn-msg-snd=msg.caf;pn-timeout=0;pn-silent=1;transport=udp
Qualify Freq : 60000 ms
Keepalive : 0 ms
Variables :
DEVICENAME = 2030
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Parkinglot : parking-1
Use Reason : No
Encryption : No
RTCP Mux : No
---------truncated and given dummy keys ---------------
我只对远程&之间的密钥(2CA57031CAA11360A09B9F37A13DE83CB337BF860352FSAFD7E9B444E5DB673B(感兴趣和:voip我想从命令out中删除除键之外的所有内容,并将其存储在变量中以供进一步处理。
我在下面试过,但没成功。
US="2030"
d=($(asterisk -r -x "sip show peer $US" | sed -e "s/.*:remote&(.*):voip.*/1/"))
echo $d
你太棒了!(非常接近(您只需要抑制sed
输出的正常打印,并仅在进行替换时打印,例如
d=($(asterisk -r -x "sip show peer $US" | sed -n "s/.*:remote&(.*):voip.*/1/p"))
其中-n
抑制图案空间的正常打印(不需要-e
和单个表达式(,而末尾的/p
仅在替换时提供打印。
注意:除非您希望d
作为一个索引数组,其中只有一个字符串作为其唯一元素,否则只需使用d=$(...)
使用awk
,您可以尝试以下操作吗。
d=($(asterisk -r -x "sip show peer $US" | awk 'match($0,/:remote&.*:voip/){print substr($0,RSTART+6,RLENGTH-11)}'))
为了更清楚地说明上述仅提及awk
命令的命令,如下所示:
awk 'match($0,/:remote&.*:voip/){print substr($0,RSTART+6,RLENGTH-11)}'