J'ai le fichier texte suivant:
sortie.log p>
Estructure du texte du fichier: p>
5896; 192.168.1.1 Je voudrais savoir combien de fois x port de colonne 3 est répété sans connaître sa valeur ou en tapant Dans le script. strong> p> Pour le moment, je teste ce code, juste pour comprendre la logique, mais je trouve vraiment comment faire correctement. P>
4587; 192.168.1.1
7815; 192.168.2.1 443 strong> 185.45.65.23 Règle: 10;
5578; 192.168.3.5
4587; 192.168.1.1 80 fort> 196.46.65.12 Règle: 25; p> file="output.log"
cat $file | awk {'print $1, $2, $3, $4, $27, $5, $6'} | tr -d ';' | tr -d ':' | grep "Rule" | while read src_port src_ip dst_port dst_ip rule num_rule;
do
uniq_dst_port=$(cat $file | awk {'print $3'} | tr -d ';' | tr -d ':' | sort | uniq)
for u_dst_port in $uniq_dst_port;
do
#echo "FIRST BUCLE: $dst_port SECOND_BUCLE: $u_dst_port"
#sleep 1
if [[ $dst_port == $u_dst_port ]]; then
#echo "IS EQUAL...."
n=$((n+1))
fi
done
if [[ $dst_port == $dst_port ]]; then
echo "The Port: $dst_port repeat $n Time"
else
echo "" >> /dev/null
fi
done
3 Réponses :
The Port 443 repeat 22 Time. The Port 535 repeat 12 Time. The Port 80 repeat 22 Time.
Merci chérie, oui, c'est génial, mais je voudrais garder le numéro de ligne au cas où je souhaiterais imprimer sous les sources où le match a été trouvé. C'est pourquoi je veux le faire avec des boucles, c'est-à-dire que je veux savoir comment traiter avec la manipulation des boucles dans ce cas.
Une autre approximation pour obtenir la sortie souhaitée peut être puis, mon script test.sh pour le traiter p> alors, Exemple de course P> $ more output.log
5896; 192.168.1.1 443 186.56.21.30 Rule: 45;
4587; 192.168.1.1 80 196.46.65.12 Rule: 25;
7815; 192.168.2.1 443 185.45.65.23 Rule: 10;
5578; 192.168.3.5 535 165.98.45.45 Rule: 5;
4587; 192.168.1.1 80 196.46.65.12 Rule: 25;
$ ./test.sh
The port 443 repeat 2 times for rules 45, 10
The port 535 repeat 1 times for rules 5
The port 80 repeat 2 times for rules 25
Pouvez-vous modifier votre question et fournir le contenu du fichier d'entrée? Dans mon cas, j'ai utilisé l'exemple que vous avez fourni dans votre question.
I La sortie de tmpfile.txt Je vois que la ligne ultime répéter 5 fois avec ceci: le port 80 B> Répéter 2 fois pour les règles 25, 25, 5, 45, 10 Pourquoi?
Le fichier d'entrée est le même sur mon message.
Mmm L'erreur est que dans mon fichier d'entrée, le dernier caractère de chaque ligne est un espace ....
Si vous avez des espaces vides à la fin, utilisez cette SED 'S / * $ // G'``
Merci@roberto Hernandez
Salut @LestHermartinreyesexinoza, pourquoi avez-vous révélé l'acceptation dans la réponse ?? Ou au moins si vous le dodiez, évitez la réponse que vous êtes reconnaissant pour l'aide fournie.
Vous lisez l'intégralité du fichier (sortie.log) et appelez trop de fois des commandes externes. C'est une overcilleuse. Le travail pourrait être fait en une seule passe comme dans la réponse acceptée.
Bonjour @LXERLX, je ne dis pas que la réponse acceptée est meilleure, à coup sûr, mais n'implique pas à être reconnaissant lorsque quelqu'un répond à toutes les questions des commentaires et de travailler pour résoudre le problème. Je crois que ça vaut aussi la peine
en plaine bash:
./ script The port 80 repeat 2 times for rules 25.
The port 443 repeat 2 times for rules 10, 45.
The port 535 repeat 1 times for rules 5.
Quelle moyenne% d% d% s dans la dernière ligne de Printf ?? Où enquêtez-vous davantage pour ce sujet avec des exemples? @M. Nejat Aydin merci
@LestHermartinreyesSexinoza in Printf code>, % d code> signifie que l'argument correspondant sera imprimé sous forme d'entier décimal et en tant que chaîne pour % s code>. Rechercher printf code> dans Manuel de référence Bash . Également lié à (mais différent de) Printf de Bash: lisez la page manuelle de printf (3) code>: man 3 printf code> ou FPRRINTF . Lire le Extransion du paramètre Shell pour comprendre < code> $ {# n} code> et $ {liste% ??} code>.