Bash:y列の値に基づいてx列の値が表示される回数の計算

Bash:y列の値に基づいてx列の値が表示される回数の計算

このような文字列があります。

data = "state:: 4 caller_contact:: sip:[email protected]:5080;transport=udp

state:: 4 caller_contact:: sip:[email protected]:5080;transport=udp

state:: 4 caller_contact:: sip:[email protected]:5080;transport=udp 

state:: 4 caller_contact:: sip:[email protected]:5080;transport=udp

state:: 2 caller_contact:: sip:[email protected]:5080;transport=udp 

state:: 2 caller_contact:: sip:[email protected]:5080;transport=udp 

state:: 1 caller_contact:: sip:[email protected]:5080;transport=udp"

各IP(たとえば、192.168.26)にステータス4またはステータス2がある回数を計算するには、bashスクリプトを作成する必要があります。 (文字列に「/n」は含まれていません)

文字列を解析して各IPに基づいて値を計算することはできません。

ベストアンサー1

可能なすべての組み合わせでこれが機能するかどうかはわかりませんが、提供した小さなサンプルでは機能します。

sed  "1,\$s/state/\nstate/g" file | grep state > NewFile
for IPADDR in $(cat NewFile | cut -d"@" -f2|cut -d":" -f1|sort -n|uniq);do
  for STATE in 2 4 ;do
    LineCount=$(grep "${IPADDR}" NewFile |grep "state:: ${STATE}"| wc -l)
    echo "For IP address ${IPADDR}, status:: ${STATE} lines count is ${LineCount}"
  done
done | grep -v "is 0"$

forループに必要に応じてさまざまなSTATE番号を追加できます。

デフォルトでは、文字列が現れるたびに改行文字を挿入してstate大きなデータブロックを形成し、複数行に分割します。

おすすめ記事