2016-12-15 2 views
0

Je suis en train de coder un simple script bash pour passer un port IP à une expression rationnelle à une commande awk. Je cherche le port que dans la destination localePasser une regexp dynamique via un script bash shell

Voici le code:

#!/bin/bash 
s=$1 
port="/[^0-9]$s$/" 
netstat -numeric | awk -v pat="$port" '$6 == "ESTABLISHED" && $4 ~ pat {print}' 

Voici par exemple des données.

tcp  0  0 1.9.1.1:23 1.9.2.1:54156 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.4:51376 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.1:53299 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.1:64695 ESTABLISHED 
tcp  0  0 1.9.1.1:53086 1.9.1.8:23 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.1:53296 ESTABLISHED 

Lorsque j'exécute le script, il ne renvoie rien.

Quand je lance manuellement, il renvoie les éléments suivants:

netstat -numeric | awk '$6 == "ESTABLISHED" && $4 ~ /[^0-9]23$/ {print}' 

tcp  0  0 1.9.1.1:23 1.9.2.1:54156 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.4:51376 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.1:53299 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.1:64695 ESTABLISHED 
tcp  0  0 1.9.1.1:23 1.9.2.1:53296 ESTABLISHED 

Toute suggestion serait grandement apprécié.

Répondre

4
port="[^0-9]$s$" 

Vous pouvez supprimer le {print}, d'ailleurs, comme c'est l'action par défaut, donc tout ce dont vous avez besoin est:

s=$1 
port="[^0-9]$s$" 
netstat -numeric | awk -v pat="$port" '$6 == "ESTABLISHED" && $4 ~ pat' 

La raison pour ce que vous aviez ne fonctionnait pas est que /.../ sont délimiteurs regexp constants , comme "..." sont des délimiteurs de constante de chaîne, les inclure dans une expression rationnelle dynamique serait comme si vous incluez les guillemets dans une chaîne, par exemple foo="\"stuff\"" au lieu de foo="stuff", les "/" font partie de l'expression rationnelle au lieu des délimiteurs pour l'expression rationnelle.

+0

donc les /.../ sont implicites. merci pour l'aide – Drewber49er

+0

Non, ils ne sont pas impliqués, lisez ce que j'ai dit à nouveau. '/.../' sont des délimiteurs ** pour les expressions rationnelles constantes **. Vous n'utilisez pas une expression régulière que vous utilisez une expression rationnelle dynamique et vous enregistrez l'expression rationnelle comme une chaîne dans une variable et dans une chaîne un '/' est juste un caractère littéral '/'. Dans '/ foo /' les '/' ne font pas partie de l'expression rationnelle, ce sont les délimiteurs autour de l'expression rationnelle qui le définissent comme une constante d'expression rationnelle. Vous pourriez utiliser des délimiteurs '" 'à la place (' $ 0 ~ "foo" ') mais cela ferait de l'expression rationnelle une expression rationnelle. –