linux bash 剪切以某个字符串开头的一行

标签 linux bash

你好,

我正在使用 linux bash 命令提取每个 sip 帐户的某些数据并将它们放在一起。

我有一个名为 $peers 的数组,我将所有 1000 个 sip 放入其中,现在我需要循环遍历它们以将每个 sip 设置为其用户代理。

我目前的情况是

#! /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

我需要从以“Useragent”开头的行集合中提取一行

我首先运行 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:101@xxx.xxx.xxx.xxx: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

但是还是有问题,我的问题是变量的循环

最佳答案

使用sed:

... | sed -nE '/Useragent/ s/^[^:]+/101 /p'
  • /Useragent/ 匹配带有 Useragent 的行

  • s/^[^:]+/101 将开始到:(不包括)的部分替换为101

关于linux bash 剪切以某个字符串开头的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39971024/

相关文章:

linux - 运行 Valgrind 会减慢我的应用程序的速度吗?

Linux 脚本 : Using perl to insert record using If-Else condition

bash - 将与模式匹配的最后一个文件的名称保存到 bash 中的变量

Android adb权限错误

java - 阻止 Java 远程访问

linux - Unix 路径需要重新排序

java - 如何在 Ubuntu 上更新已经安装的 IntelliJ IDEA?

bash - 在 shell 中打印具有多行值的变量?

string - 在bash中获取多个空格后的字符串

macos - shc 在 Mac 上显示 'Killed: 9' 错误