Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Supprimer plusieurs données avec sed


Sujet :

Shell et commandes POSIX

  1. #1
    Expert éminent
    Supprimer plusieurs données avec sed
    Bonjour

    Je dispose d'un fichier 'hosts' dont voici un extrait:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    # Title: StevenBlack/hosts with the fakenews, gambling, porn and social extensions #
    # This hosts file is a merged collection of hosts from reputable sources,
    # with a dash of crowd sourcing via GitHub
    #
    # Date: 15 November 2020 18:37:51 (UTC)
    # Extensions added to this file: fakenews, gambling, porn, social
    # Number of unique domains: 88,597
    #
    # Fetch the latest version of this file: https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling-porn-social/hosts
    # Project home page: https://github.com/StevenBlack/hosts
    # Project releases: https://github.com/StevenBlack/hosts/releases
    #
    # ===============================================================
     
    127.0.0.1 localhost
    127.0.0.1 localhost.localdomain
    127.0.0.1 local
    255.255.255.255 broadcasthost
    ::1 localhost
    ::1 ip6-localhost
    ::1 ip6-loopback
    fe80::1%lo0 localhost
    ff00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
    0.0.0.0 0.0.0.0
     
    # Custom host records are listed here.
     
     
    # End of custom host records.
    # Start StevenBlack
     
    #=====================================
    # Hosts contributed by Steven Black
    # http://stevenblack.com
     
    0.0.0.0 n2019cov.000webhostapp.com
    0.0.0.0 webmail-who-int.000webhostapp.com
    0.0.0.0 010sec.com
    0.0.0.0 01mspmd5yalky8.com

    Avec le code suivant:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cat "t_f" |\
        sed -r -e 's/#.*//g' \
               -e '/^\s*$/d' \
               -e 's/\r//g' >> "$p_f"

    Je parviens à supprimer tous les commentaires commençons par '#', les lignes vides et les retours à la ligne.
    Ce qui donne:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    127.0.0.1 localhost
    127.0.0.1 localhost.localdomain
    127.0.0.1 local
    255.255.255.255 broadcasthost
    ::1 localhost
    ::1 ip6-localhost
    ::1 ip6-loopback
    fe80::1%lo0 localhost
    ff00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
    0.0.0.0 0.0.0.0
    0.0.0.0 n2019cov.000webhostapp.com
    0.0.0.0 webmail-who-int.000webhostapp.com
    0.0.0.0 010sec.com
    0.0.0.0 01mspmd5yalky8.com

    Je dois également supprimer toutes les parties en bleue mais à ce stade, je bloque. Un petit coup de main s'il vous plaît ?

    En vous remerciant par avance
    .Olivier

  2. #2
    Expert éminent sénior
    Bonjour

    Alors d'abord, je t'invite à la prudence. Tu ne supprimes pas les lignes de commentaires mais les lignes qui ont un commentaire.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ grep '.#' /etc/hosts |wc -l
    167
    $ grep '#' /etc/hosts |wc -l
    366
    $ cat /etc/hosts |wc -l
    13494


    Exemple ne devant pas être supprimé :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    74.125.127.105 g        # google.com


    Ensuite, dans le fichier, les lignes ne sont pas en bleu. Quels sont les critères de choix qui t'ont poussé à mettre ces bouts en bleu. Ensuite, on traduira en regex.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent
    Coucou

    J'utilise 'unwind' qui est un résolveur DNS de validation sous OpenBSD 6.8.

    L'objectif, c'est de créer une liste de blocage concernant les fake news, les jeux de hasard, la pornographie etc.

    Cette liste a juste besoin des noms d'hôte. Je ne veux en aucun cas intégrer les 88597 noms d'hôtes dans mon fichier 'hosts'
    .Olivier

  4. #4
    Expert éminent sénior
    Bonjour,
    Et si tu essayais dans l'autre sens, passer par un grep pour récupérer ce que tu as besoin au lieu de virer ce que tu n'as pas besoin ?

    si je reprends ton fichier en exemple, la ligne suivante de grep récupère les 4 éléments à garder:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    grep -o ' [0-9a-z.-]\+\.[a-z]\{2,4\}[^a-z0-9.-]*$' fichier

    Après, faudrait voir si ça fonctionne sur la totalité du vrai fichier.

    Sachant qu'ici, la regex (certainement incomplète) part sur le principe qu'un nom d'hote est une suite de lettre,chiffre,tiret,point et surtout fini par un point + au moins 2 lettres et au plus 4 lettres.

    PS: Mon test est fait sous un linux, donc grep est peut-être différent.
    Cordialement.

  5. #5
    Expert éminent
    Désolé pour la réponse tardive, tout d'abord je te remercie pour cet exemple que je vais tester de ce pas
    .Olivier

###raw>template_hook.ano_emploi###