このような文字列があります。
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
大きなデータブロックを形成し、複数行に分割します。