J'ai extrait le jour / mois et l'IP qui renforcent continuellement mon serveur IMAP:

Nov1 unknown[186.216.99.239]:
Nov1 unknown[62.249.196.214]:
Nov1 unknown[110.145.123.120]:
Nov1 fixed-187-190-251-149.totalplay.net[187.190.251.149]:
Nov1 pd9568164.dip0.t-ipconnect.de[217.86.129.100]:
Nov1 unknown[103.227.88.130]:

Je veux que la sortie soit comme ci-dessous:

Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

J'ai obtenu ce résultat en combinant sed, awk et cut avec le code ci-dessous, mais j'aimerais savoir s'il existe de meilleures façons?

while read -r line
    do 
        monthday=$(echo $line | awk '{ print $1 }')
        # ip=$(echo $line | awk -F'[\\\[\\\]]' { print $2 } ) 
        ip=$(echo $line| cut -d[ -f2| cut -d] -f1 )
        echo "${monthday} ${ip}"
    done < badIpList.txt
2
satch_boogie 16 nov. 2017 à 18:50

4 réponses

Meilleure réponse

Solution awk :

awk -F'[[:space:]\\[\\]]' '{print $1,$3}' file
  • -F'[[:space:]\\[\\]]' - séparateur de champ complexe, soit un espace [:space:], soit [ ou ]. Ainsi, la ligne, par exemple. Nov1 unknown[186.216.99.239]: sera divisé en champs: 1) Nov1, 2) unknown, 3) 186.216.99.239 et 4) :

Le résultat:

Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130
1
RomanPerekhrest 16 nov. 2017 à 16:08

Simple avec ce sed:

$ sed -r 's|^([^ ]*)[^[]*\[([^]]*)\].*|\1 \2|' badIpList.txt
Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

Logique: Imprimez le premier mot et le contenu du crochet carré.

1
anishsane 16 nov. 2017 à 16:02

Essaye ça

sed -E 's/\s.*\[(.*)\]:/ \1/' file

Aucune boucle nécessaire.

1
karakfa 16 nov. 2017 à 15:56

Avec awk: définissez le séparateur de champ sur l'un des espaces, [ ou ], puis imprimez le premier et le troisième champ:

$ awk -F "[][ ]" '{ print $1, $3 }' infile
Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

Notez que le séparateur de champ est une expression régulière, à savoir l'expression entre crochets [][ ]. À partir du manuel gawk:

Pour inclure l'un des caractères \, ], - ou ^ dans une expression entre crochets, placez un \ devant lui.

Donc l'expression devrait être

[\[\] ]

Mais parce que les expressions régulières stockées dans des chaînes ("expressions rationnelles dynamiques / calculées ") sont scannés deux fois , nous devons échapper la barre oblique inverse:

-F '[\\[\\] ]'

Ou pour utiliser des guillemets doubles, comme je l'ai fait, je devrais échapper à la fois la barre oblique inverse et la barre oblique inverse qui l'échappait:

-F "[\\\[\\\] ]"

Ce qui n'est clairement pas trop lisible. Heureusement, il y a une faille:

De plus, si vous placez ] juste après l'ouverture [, le crochet fermant est traité comme l'un des caractères à mettre en correspondance.

Alors on s'en sort

-F "[][ ]"

Même entre guillemets. Il n'y a pas vraiment de raison d'utiliser des guillemets doubles ici, d'ailleurs.

4
Benjamin W. 16 nov. 2017 à 16:37
47333893