Como faço para contar linhas e fazer uma divisão simples na linha de comando?

2

Aqui estão algumas linhas do meu arquivo de entrada:

  08:51:36 UN 127.0.0.1
  08:51:36 UN 127.0.0.2
  08:51:36 UN 127.0.0.3
  08:53:50 DN 127.0.0.1
  08:53:50 DN 127.0.0.2
  08:53:50 DN 127.0.0.3

Eu quero escrever um script de shell que tenha como entrada o endereço IP

 ./CountRate.sh 127.0.0.1

Este script deve retornar 0,5. A fórmula é: O número de vezes que o nó com IP 127.0.0.1 tem o status UN que é "1" DIVIDIDO pelo número de linhas nas quais aparecem 127.0.0.1, que é "2". Quais comandos do Linux eu tenho que usar para conseguir isso?

    
por user1543915 11.07.2018 / 13:06

2 respostas

1

O script abaixo usa dois parâmetros: (endereço IP e nome do arquivo de entrada)

#!/bin/bash

echo "IP address: $1"
echo "Input file name: $2"

Count_IP=$(grep -c "$1" "$2" )
Count_IP_UN=$(grep "$1" "$2" |grep -c "UN")

echo "IP Count: $Count_IP"
echo "IP Count with UN: $Count_IP_UN"

Result=$(bc <<< "scale=1; $Count_IP_UN/$Count_IP"| awk '{printf "%0.1f", $0}')
echo "The result is: $Result"

Exemplo de execução:

$ ./CountRate.sh 127.0.0.1 inp.txt 
IP address: 127.0.0.1
Input file name: inp.txt
IP Count: 2
IP Count with UN: 1
The result is: 0.5
    
por 11.07.2018 / 13:49
9

A linguagem de script awk pode fazer isso facilmente:

awk -v host=127.0.0.1 '
  $3 == host {n++; x += $2 == "UN" ? 1 : 0} 
  END {print x/n}
' inputfile
0.5
    
por 11.07.2018 / 13:42