3 votes

Utilisation de SED pour supprimer les deux-points à la fin de la ligne après une correspondance d'adresse IPv4

Le script correspond à l'IP privée dans le fichier et imprime la 3ème colonne.

La valeur de la 3ème colonne peut être soit IPv4 soit IPv6. L'adresse IPv4 est suivie d'un ":PORT". Je peux exécuter sed 's/:.*//g' mais cela aura également un impact sur l'adresse IPv6 si elle est imprimée. De même, si j'utilise des FS multiples [, :], l'adresse IPv4 sera imprimée, mais seulement le premier octet de l'adresse IPv6.

Ma solution consiste à supprimer le ":PORT" de la fin de l'adresse IPv4.

$ cat openvpn-status.log
10.13.0.27,ijegunbead-4,74.201.72.222:49911,2022-06-26 02:55:26
10.13.0.23,biddy-h-1,2803:4600:1111:17ec:a821:1a8:53ca:760d,2022-06-26 02:55:28

J'ai fait tourner ceci dans une boucle while, un cycle dst sera == 10.13.0.27 le suivant == 10.13.0.23

dst1=$(egrep -w ^$dst /etc/openvpn/openvpn-status.log | awk -F'[,:]' '{print $3}')

Résultat :

74.201.72.222
2803

Résultat souhaité :

74.201.72.222
2803:4600:1111:17ec:a821:1a8:53ca:760d

J'ai essayé ceci mais pas de chance

dst1=$(egrep -w ^$dst /etc/openvpn/openvpn-status.log | awk -F',' '{print $3}') | sed 's/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:*//g'

3voto

tink Points 1856

Cela vous conviendrait-il ?

$ awk -F, '$3~/\./{sub(/:.*$/,"",$3)}{print $3}' openvpn-status.log
74.201.72.222
2803:4600:1111:17ec:a821:1a8:53ca:760d

1voto

Daweo Points 10024

Solution employant sed comme demandé dans le titre de la question, laissez file.txt contenu être

10.13.0.27,ijegunbead-4,74.201.72.222:49911,2022-06-26 02:55:26
10.13.0.23,biddy-h-1,2803:4600:1111:17ec:a821:1a8:53ca:760d,2022-06-26 02:55:28

entonces

cut --delimiter=',' --field=3 file.txt | sed '/^[0-9]*[.]/ s/:[0-9]*$//'

donne la sortie

74.201.72.222
2803:4600:1111:17ec:a821:1a8:53ca:760d

Explication : utilisez cut pour récupérer le 3ème champ du fichier ,-délimité, puis pour chaque ligne qui commence par zéro ou plus chiffres suivis par un point littéral, remplacez : et zéro ou plus chiffres adjacents à la fin de la ligne par une chaîne vide, c'est-à-dire supprimez-la.

(testé dans GNU sed 4.7)

1voto

mrqiao001 Points 44
# perl -MRegexp::Common=net -F, -lanE  'say $& if $F[2] =~ /$RE{net}{IPv4}|$RE{net}{IPv6}/g' file 
74.201.72.222        
2803:4600:1111:17ec:a821:1a8:53ca:760d

https://unix.stackexchange.com/questions/566517/grep-regular-expression-that-matches-all-valid-ipv4-and-ipv6-addresses

https://metacpan.org/pod/Regexp::Common

2.

# awk -F, '{if($3~/\./){gsub(/:/,",")}; print $3}'  file          
74.201.72.222        
2803:4600:1111:17ec:a821:1a8:53ca:760d

0voto

HatLess Points 73

Utilisation de sed

$ sed 's/\([^,]*,\)\{2\}\([^,]*\).*/\2/;/\./s/:.*//' input_file
74.201.72.222
2803:4600:1111:17ec:a821:1a8:53ca:760d

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X