#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é
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
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
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...
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?
marrant personne n'a le meme nombre...
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é
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 ???
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?
ça parait compliqué
Pourquoi pas simplement
ls /etc/ |grep '^[hH]'|wc -w
?
$ ls /etc/ |grep '^[hH]'|wc -w
9
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
"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?
Mais personnellement dans /etc/, j'ai 8 fichiers qui commencent par h, ou alors j'ai mal compris la question
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?
DEoT a écrit :Mais personnellement dans /etc/, j'ai 8 fichiers qui commencent par h, ou alors j'ai mal compris la question
C'est les mots commençant par h dans chaque fichier de /etc qui est recherché.
la boulette
je cherche une autre solution alors
"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
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?
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