删除除2个匹配模式外壳脚本之间的文本之外的所有文本



让我解释一下我要做什么。我试图在两个匹配模式之间提取一个键,并从命令输出(而不是文件(中删除所有内容,并将其放入变量中以供进一步使用。

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)}'

最新更新