Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/04/2011, à 21:59

siho

Quelle est la commande shell pour afficher ce résultat?

Bonsoir à tous,
Voila j'aimerai un peu d'aide pour écrire une commande qui permet d'afficher le nombre de mots qui commencent par h dans tous les fichiers du répertoire /etc

je sais que je dois utiliser la commande wc

genre:

wc -w /etc/*

mais ça, ça me donne le nombre de tous les mots pas seulement ceux qui commencent par h...

comment faire pour ne sélectionner que les mots qui commencent par h

merci

Hors ligne

#2 Le 17/04/2011, à 23:39

aduxas

Re : Quelle est la commande shell pour afficher ce résultat?

Un premier jet rapide, et je n'en suis pas fier:

sudo -i
for i in `find /etc/* -prune -type f`; do sed 's/\<h/h@\n/g' $i | grep -c '\<h@';done |awk '{sum+=$1} END{print sum}'

Il faut savoir que "grep -c" ne compte que le nombre de lignes, non pas le nombre d'occurences.  Je remplace donc les "h" en début de mot par "h@" plus un retour à la ligne, en espérant que "h@" ne s'y trouvait pas avant (ce qu'on pourrait vérifier d'abord).

Si tu veux descendre dans les sous-répertoires, il faut enlever "/* -prune".

Dernière modification par aduxas (Le 17/04/2011, à 23:44)

Hors ligne

#3 Le 17/04/2011, à 23:47

aduxas

Re : Quelle est la commande shell pour afficher ce résultat?

Un peu plus simple:

sudo -i
find /etc/* -prune -type f -exec sed 's/\<h/h@\n/g' {} \; |grep -c '\<h@'

Hors ligne

#4 Le 18/04/2011, à 00:09

siho

Re : Quelle est la commande shell pour afficher ce résultat?

d'accord... et moi qui pensais avoir trouvé la solution avec

grep -c "^h" /etc/*

c'est raté sad

bon, j'ai compris votre astuce,mais j'ai pas compris le \<h/h@\n
enfin... si.... j'ai compris le h@\n mais pas le reste

merci infiniment pour votre aide

Dernière modification par siho (Le 18/04/2011, à 00:09)

Hors ligne

#5 Le 18/04/2011, à 00:16

aduxas

Re : Quelle est la commande shell pour afficher ce résultat?

"\<h" est utilisé pour indiquer un "h" en début de mot, tout comme "k\>" indique un "k" en fin de mot. Après chaque "h" en début de mot, j'insère donc un "@" et je coupe à la ligne.  Comme ça, il me suffit de compter le nombre de lignes qui contiennent "\<h@".

Dernière modification par aduxas (Le 18/04/2011, à 00:17)

Hors ligne

#6 Le 18/04/2011, à 01:40

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

Bjr,
C'est pas l'option -R de grep pour matcher un mot dans des fichiers ?

grep -R ' h' ~/Dossier 2>/dev/null | nl | tail -n 1 | awk '{print $1}'

C'est pas du tout optimisé !

EDIT: Ca compte les lignes, pas le mots dsl !

Dernière modification par AnsuzPeorth (Le 19/04/2011, à 15:01)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#7 Le 18/04/2011, à 01:52

aduxas

Re : Quelle est la commande shell pour afficher ce résultat?

grep -R descend dans les sous-directories, en effet.  Siho ne spécifie pas s'il veut faire ça.  En tout cas, tu comptes le nombre de lignes, pas le nombre de mots.  Je trouve 6649, tandis que ta méthode donne 3650.  Sans descendre dans les sous-directories, je trouve 755.

EDIT:  flûte, ton EDIT n'était pas là quand j'ai commençé ma réponse...

Dernière modification par aduxas (Le 18/04/2011, à 01:54)

Hors ligne

#8 Le 18/04/2011, à 02:01

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

J'avais pas tout compris encore smile
Donc juste les fichiers qui sont dans /etc

grep ' h' /etc/* 2>/dev/null | sed 's/ h/\n/g' | nl | tail -n 1 | awk '{print $1}'
645

EDIT: j'abandonne pour ce soir, plus la tête à ça smile
Avec ta méthode j'ai 630 !
Je dois trop découper, ça en ajoute ...

Dernière modification par AnsuzPeorth (Le 18/04/2011, à 02:10)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 18/04/2011, à 02:35

aduxas

Re : Quelle est la commande shell pour afficher ce résultat?

Avec "/etc/*", tu inclus les fichiers de répertoire, qui pourraient contenir de smots commençant par "h".  Je ne pense pas que ce soit indiqué.  En plus, tu sous-entends qu'un mot commence toujours par un blanc.  Ce n'est pas la définition "regexp" --voici un mot qui commence par v sans blanc devant !

Dernière modification par aduxas (Le 18/04/2011, à 02:35)

Hors ligne

#10 Le 18/04/2011, à 21:49

Hizoka

Re : Quelle est la commande shell pour afficher ce résultat?

egrep -i "^h| h" /etc/* | sed 's/^[hH]\| [hH]/@@@@\n/g' | grep -c "@@@@"

Bon, voilà une proposition :
- On recherche tous les " h", " H" et lignes commençant par "h" ou "H" dans etc
- on modifie ces "h" par @@@@ et saut de ligne
- On calcul le nombre de lignes contenant @@@@

aduxas
=> il cherche des mots commençant par h, donc --help n'en fait pas partie car ce n'est pas help mais --help, donc de mon point de vue, ça doit pas être pris en compte...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#11 Le 19/04/2011, à 00:54

wsc

Re : Quelle est la commande shell pour afficher ce résultat?

Avec les subdirectory:

grep -Roi "\<h" /etc/* | wc -l

sans subdirectory:

grep -oi "\<h" /etc/* | wc -l

(linsensible à la case)
Juste en h minuscule et recursif:

grep -Ro "\<h" /etc/* | wc -l

Dernière modification par wsc (Le 19/04/2011, à 00:54)


#!/bin/crash
SYS="Arch Linux avec FVWM Crystal"
echo -e "\nMon site internet et le weB-log ... \nMon système: $SYS \n\n"
sleep 2 && exit 0

Hors ligne

#12 Le 19/04/2011, à 01:37

Hizoka

Re : Quelle est la commande shell pour afficher ce résultat?

marrant personne n'a le meme nombre... tongue


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#13 Le 19/04/2011, à 14:05

wsc

Re : Quelle est la commande shell pour afficher ce résultat?

Hizoka a écrit :

marrant personne n'a le meme nombre... tongue

La mienne est pas bonne


echo -e "haha --haha \n haha" | grep -oi "\<h" | wc -l
3


#!/bin/crash
SYS="Arch Linux avec FVWM Crystal"
echo -e "\nMon site internet et le weB-log ... \nMon système: $SYS \n\n"
sleep 2 && exit 0

Hors ligne

#14 Le 19/04/2011, à 14:20

wsc

Re : Quelle est la commande shell pour afficher ce résultat?

sinon

[root@wsc flo]# egrep -i "^h| h" /etc/* | sed 's/^[hH]\| [hH]/@@@@\n/g' | grep -c "@@@@"
1253
[root@wsc flo]# grep -i "\<h" /etc/* | tr "[:punct:][:cntrl:]" "A" | grep -oi "\<h" | wc -l
1253

La première celle de Hizoka (si on admet que le résultat est bon) est bien plus rapide que la mienne.
Le problème de mes premières propositions étant qu'elles prenaient en compte les --help ..help etc

Celle de AnsuzPeorth
grep ' h' /etc/* 2>/dev/null | sed 's/ h/\n/g' | nl | tail -n 1 | awk '{print $1}'
doit pas prendre en compte les lignes commençants par h car il "match un espace avant le h.


#!/bin/crash
SYS="Arch Linux avec FVWM Crystal"
echo -e "\nMon site internet et le weB-log ... \nMon système: $SYS \n\n"
sleep 2 && exit 0

Hors ligne

#15 Le 19/04/2011, à 14:53

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

J'avais proposé ça tard dans la nuit, faut que j'arrête, j'oublie la moitié smile

Sinon, j'avais fait en python, et ben, j'ai un résultat complétement différent.

a = 0
for i in os.listdir("/etc"):
    try: f = open("/etc/"+i)
    except: continue
    for line in f:
        l = [ i for i in line.split(' ') if i.startswith('h')]
        a += len( l )
    f.close()
print a
365

methode hizoka et wsc: 381
methode aduxas: 612

Que penser ??? big_smile

J'aurais plus confiance au python, l'algo est simple, je coupe chaque ligne avec comme délimiteur l'espace, ca me crée une liste (avec le premier mot également), et je check pour chaque éléments de la liste si il commence pas h.


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#16 Le 19/04/2011, à 15:02

DEoT

Re : Quelle est la commande shell pour afficher ce résultat?

ça parait compliqué

Pourquoi pas simplement

ls /etc/ |grep '^[hH]'|wc -w

?


"Les jeux vidéos n'affectent pas les enfants : je veux dire si Pac-Man nous avait influencé étant enfant, nous devrions tous courrir en rond dans des pièces sombres, en gobant des pillules magiques tout en écoutant de la musique répétitive."

Hors ligne

#17 Le 19/04/2011, à 15:02

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

Bon, pas moyen d'éditer le message !!!
Pour essayer le code python
ajouter en début

#! /usr/bin/env python
# -*- coding:Utf-8 --*-
import os

Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#18 Le 19/04/2011, à 15:03

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

DEoT a écrit :

ça parait compliqué

Pourquoi pas simplement

ls /etc/ |grep '^[hH]'|wc -w

?

$ ls /etc/ |grep '^[hH]'|wc -w
9

big_smile


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#19 Le 19/04/2011, à 15:08

DEoT

Re : Quelle est la commande shell pour afficher ce résultat?

Si on veut aussi lister les sous répertoire, on peut utiliser ls -R /etc/

Mais personnellement dans /etc/, j'ai 8 fichiers qui commencent par h, ou alors j'ai mal compris la question wink


"Les jeux vidéos n'affectent pas les enfants : je veux dire si Pac-Man nous avait influencé étant enfant, nous devrions tous courrir en rond dans des pièces sombres, en gobant des pillules magiques tout en écoutant de la musique répétitive."

Hors ligne

#20 Le 19/04/2011, à 15:17

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

DEoT a écrit :

Mais personnellement dans /etc/, j'ai 8 fichiers qui commencent par h, ou alors j'ai mal compris la question wink

C'est les mots commençant par h dans chaque fichier de /etc qui est recherché.


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#21 Le 19/04/2011, à 15:20

DEoT

Re : Quelle est la commande shell pour afficher ce résultat?

AnsuzPeorth a écrit :
DEoT a écrit :

Mais personnellement dans /etc/, j'ai 8 fichiers qui commencent par h, ou alors j'ai mal compris la question wink

C'est les mots commençant par h dans chaque fichier de /etc qui est recherché.

lol la boulette

je cherche une autre solution alors smile


"Les jeux vidéos n'affectent pas les enfants : je veux dire si Pac-Man nous avait influencé étant enfant, nous devrions tous courrir en rond dans des pièces sombres, en gobant des pillules magiques tout en écoutant de la musique répétitive."

Hors ligne

#22 Le 19/04/2011, à 15:42

AnsuzPeorth

Re : Quelle est la commande shell pour afficher ce résultat?

130

Qui dit mieux smile

mais il faudrait un exemple où l'on connait le résultat pour comparer

Ben crée des fichier avec un nombre défini de mots commençant par h (là j'ai pas le temps, je suis en plein dans l'écriture d'une doc ...)

Dernière modification par AnsuzPeorth (Le 19/04/2011, à 15:43)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#23 Le 19/04/2011, à 16:15

FRUiT

Re : Quelle est la commande shell pour afficher ce résultat?

Est-ce que "H" est un mot ? Si non, combien de lettres minimum ? Comme dit plus haut "--help" est-il un mot ?

On compte les doublons ou pas ?

Les fichiers binaires ? cachés ?

Faudrait déjà que l'énoncé du problème pose quelques bases...


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#24 Le 19/04/2011, à 17:26

johndo

Re : Quelle est la commande shell pour afficher ce résultat?

Bonjour,

Je propose ceci :

#!/bin/bash

hWordCpt=0
all=0
shopt -s globstar nullglob 
for file in /etc/*
do
        [ -f "${file}" ] && {
                while read -a words
                do
                        ((all+=${#words[@]}))
                        hWords=(  ${words[@]/#[!hH]*} )
                        ((hWordCpt+=${#hWords[@]}))
                done < "${file}"
        } 2>/dev/null
done
echo "${hWordCpt}/${all} mot(s) trouvé(s)."

Notes :
- si récursif, ajouter un * à /etc/* --> /etc/**
- si pas de permission en lecture sur un fichier, ce fichier n'est pas comptabilisé

Dernière modification par johndo (Le 20/04/2011, à 08:24)

Hors ligne

#25 Le 20/04/2011, à 23:15

aduxas

Re : Quelle est la commande shell pour afficher ce résultat?

wsc a écrit :

sans subdirectory:

grep -oi "\<h" /etc/* | wc -l

Je ne connaissais pas "-o".  C'est fort utile.  Une différence entre ma méthode et la tienne, ce sont les liens.  Je ne les considère pas; toi, si.  Si je rajoute -H chez moi et j'enlève -i chez toi, ca se rapproche pas mal.  Les fichiers binaires sont un autre problème, p.e. /etc/ld.so.cache.  Ma spécification de type "fichier" le prend en compte et y trouve 62 mots, tandis que ton "grep" génère un message

Binary file /etc/ld.so.cache matches

, ce qui compte pour toi comme un mot!  Rediriger les erreurs sur /dev/null corrige ce problème.  Je suppose que zéro est la bonne réponse ici.  Ceci dit, j'ai l'impression que siho a décroché!

Dernière modification par aduxas (Le 20/04/2011, à 23:16)

Hors ligne