확장된 파이프라인 체인 처리(...Asterisk -> grep -> ping)

확장된 파이프라인 체인 처리(...Asterisk -> grep -> ping)

명령에서 값을 가져와 다른 명령에 사용하고 싶습니다. 예제 명령은 다음과 같습니다.

 cat /var/log/asterisk/full |
   grep "UNREACHABLE" |
   awk '{print $7;}'|
   sort | uniq |
   xargs -I % asterisk -rx 'sip show peer %'|
   grep "Callerid\|Useragent\|Name\|Addr->IP"

UNREACHABLE을 통과하는 라인은 다음과 같습니다.

[10월 8일 04:10:55] 참고 [29814] chan_sip.c: 이제 피어 'sip-437-id'에 연결할 수 없습니다! 마지막 프로모션: 26

awk '{print $7;}'

'sip-437-id' 이런 메시지가 왔어요

sort | uniq 

장치만 정렬 및 고유함

 xargs -I % asterisk -rx 'sip show peer %'

사용자 확장 xargs wt에 속하는 추가 정보를 얻었습니다.

* Name       : sip-437-id
Secret       : <Set>
MD5Secret    : <Not set>   
Remote Secret: <Not set>   
Context      :default   
Subscr.Cont. : default   
Language     :   
AMA flags    :Unknown   
Transfer mode: open   
CallingPres  : 
Presentation Allowed,Not Screened   
Callgroup    :   
Pickupgroup  :   
MOH Suggest  :  
Mailbox      : 492@default   
VM Extension : asterisk   
LastMsgsSent : 0/0   
Call limit   : 2   
Max forwards : 0   
Dynamic      : Yes  
Callerid     : "TELEPHONE" <492>   
MaxCallBR    : 384 kbps   
Expire   : 1671   
Insecure     : no   
Force rport  : No   
ACL          : Yes  
DirectMedACL : No   
T.38 support : No   
T.38 EC mode : Unknown T.38
> MaxDtgrm: 4294967295   
DirectMedia  : No   
PromiscRedir : No  
> User=Phone   : No   
Video Support: No   
Text Support : No   
Ign SDPver  : No   
Trust RPID   : Yes   
Send RPID    : Yes   
TrustIDOutbnd:Legacy   
Subscriptions: Yes   
Overlap dial : Yes   
DTMFmode     :rfc2833   
Timer T1 : 500   
Timer B      : 32000   
ToHost       :  
Addr->IP     : 10.34.34.45:5063   
Defaddr->IP  : (null)   
Prim.Transp. : UDP   
Allowed.Trsp : UDP   Def. U
sername: sip-492-id   
SIP Options : (none)   
Codecs       : 0x10c (ulaw|alaw|g729)   
Codec Order  : (g729:20,ulaw:20,alaw:20)   
Auto-Framing : No   
Status       : OK (26 ms)   
Useragent    : Yealink SIP-T20P 9.61.0.85   
Reg. Contact : sip:sip-437-id @10.34.34.45:5063   
Qualify Freq : 60000 ms   
Sess-Timers : Accept   
Sess-Refresh : uas   
Sess-Expires : 1800 secs   
Min-Sess   : 90 secs   
RTP Engine   : asterisk   
Parkinglot   :   
Use Reason   : No   
Encryption   : No
grep "Callerid\|Useragent\|Name\|Addr->IP"

나는 이 정보로부터 나에게 필요한 정보를 얻는다.

> * Name       : sip-437-id
> Callerid     : "TELEPHONE" <492>
> Addr->IP     : 10.34.34.45:5063
> Useragent    : Yealink SIP-T20P 9.61.0.85
> Addr->IP     : 10.34.34.45:5063

이 정보는 화면 Addr->IP : 10.34.34.45:5063 에 기록됩니다.

IP 주소를 ping하여 정보 아래에 인쇄하고 싶습니다.

예를 들어:

>   * Name       : sip-437-id   
> Callerid     : "TELEPHONE" <492>
> Addr->IP     : 10.34.34.45:5063   
> Useragent    : Yealink SIP-T20P 9.61.0.85 
> PING 10.34.34.45 (10.34.34.45) 56(84) bytes of data. 64 bytes from
> 10.34.34.45: icmp_req=1 ttl=62 time=6.22 ms 64 bytes from
> 10.34.34.45: icmp_req=2 ttl=62 time=6.25 ms

결과를 표시하고 계속 처리해야 합니다.

답변1

최적화:

awk '/UNREACHABLE/{ print $7 }' /var/log/asterisk/full | sort -u \
    | xargs -I % asterisk -rx 'sip show peer %' \
    | grep "Callerid\|Useragent\|Name\|Addr->IP" \
    | awk -F':' '1;/Addr->IP/{ system("ping -c4 "$2)}'

관련 정보