#26 Le 11/03/2013, à 18:19
- ar barzh paour
Re : [Résolu] choix pour des recherches dans des fichiers
grep ou awk j'hésite encore !!!!!
j'ai commencé à regarder les expressions régulières
dans certains cas un grep est très simple
awk à l'air plus simple pour analyser les champs
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#27 Le 11/03/2013, à 18:22
- tiramiseb
Re : [Résolu] choix pour des recherches dans des fichiers
Oui, clairement si tu veux *analyser* avec awk tu peux tout faire en un seul appel de commande.
En même temps awk c'est un langage à lui tout seul alors que les autres c'est des outils qui ont des rôles précis et limités.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#28 Le 13/03/2013, à 18:49
- ar barzh paour
Re : [Résolu] choix pour des recherches dans des fichiers
bon voilà je me suis créé 4 shell tous simples , encore perfectibles ,il y a encore quelques erreurs
je peux peut-être simplifié en utilisant {m} dans les expressions mais je trouve que ça tourne pas trop mal , avec un gain de temps de recherche énorme !!!! , pour une analyse plus fine des expressions je pense que je me tournerais vers awk
je marque Résolu dans le titre
donne le lignes dont le champ "n" commence par "mot" : sh_n_com "$mot" $"n"
le shell : ( remarque les commentaires 1 2 3 4 5 6 7 8 9 n'apparaissent pas à leur bonne place )
#!/bin/bash
echo "paramètres recus dans $0 : " $@
# "syntaxe <nom du shell> <"chaine"> <num>"
# $1 est le début de mot à rechercher doit être différent de * ou de ( ou de [ ou de !!!!
# résolution de quelques anamolies de recherche si le mot contient ( [ ] ) et ... d'autres à voir
tmp1=`echo "$1" | sed 's/\[/\\\[/'` # remplace [ par \[ :s / \[ / \\\[ /
tmp2=`echo "$tmp1" | sed 's/(/\\\(/'` # remplace ( par \( :s/ ( / \\\( /
tmp3=`echo "$tmp2" | sed 's/)/\\\)/'` # remplace ) par \) :s/ ) / \\\) /
var=$tmp3
# reste à résoudre les accents é ñ è ç etc
echo
if [[ -z $var ]]
then
echo "paramètre de recherche vide"
read g
exit 0
fi
fich=./dico.txt
#bre(1);0;fra(3);type(4);plu_rad(5);pl](6);[pron](7);x2(8);m],f](9);reste(10)
echo " champ commençant $var dans le $2 ème champ"
# $2 est le numéro du champ dans lequel rechercher
case $2 in
0 | 1 )
# 1 2 3 4 5 6 7 8 9
grep -iE "^$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
2)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
3)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
4)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
5)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
6)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
7)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
8)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*" $fich
;;
9)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*" $fich
;;
10)
# 1 2 3 4 5 6 7 8 9
grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var" $fich
;;
*)
echo "syntaxe incorrecte $0 \"chaine\" num"
echo " avec num = 0 1 2 3 4 5 6 7 8 9 ou 10"
;;
esac
echo "fin de recherche"
read g
donne les lignes dont le champ "n" finit par "mot" : sh_n_fin "$mot" $"n"
le shell :
#!/bin/bash
echo "paramètres recus dans $0 : " $@
# "syntaxe <nom du shell> <"chaine"> <num>"
#var=$1 # c'est la fin du mot à rechercher doit être différent de * ou de ( ou de [ ou de !!!!
# ] marche
tmp1=`echo "$1" | sed 's/\[/\\\[/'` # remplace [ par \[ :s / \[ / \\\[ /
tmp2=`echo "$tmp1" | sed 's/(/\\\(/'` # remplace ( par \( :s/ ( / \\\( /
tmp3=`echo "$tmp2" | sed 's/)/\\\)/'` # remplace ) par \) :s/ ) / \\\) /
var=$tmp3
echo
if [[ -z $var ]]
then
echo "paramètre de recherche vide"
read g
exit 0
fi
fich=./dico.txt
#bre(1);0;fra(3);type(4);plu_rad(5);pl](6);[pron](7);x2(8);m],f](9);reste(10)
echo " champ finissant par $var dans le $2 ème champ"
# $2 est le numéro du champ dans lequel rechercher
case $2 in
0) # dans la ligne
grep -iE $var$ $fich
;;
1) # dans le champ 1
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
2) # dans le champ 2
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
3) # dans le champ 3
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
4)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
5)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
6)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*" $fich
;;
7)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*" $fich
;;
8)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*" $fich
;;
9)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*" $fich
;;
10)
# 1 2 3 4 5 6 7 8 9
grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var$" $fich
;;
*)
echo "syntaxe incorrecte $0 \"chaine\" num"
echo " avec num = 0 1 2 3 4 5 6 7 8 9 ou 10"
;;
esac
echo "fin de recherche"
read g
j'ai deux autres shell du même tabac
SH_n_exact présence exactement du "mot" dans le champ n et
SH_n_cont : le champ n contient le mot
si vous avez encore quelques conseils je suis preneur
Dernière modification par ar barzh paour (Le 13/03/2013, à 18:56)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#29 Le 13/03/2013, à 19:23
- tiramiseb
Re : [Résolu] choix pour des recherches dans des fichiers
si vous avez encore quelques conseils je suis preneur
Pour tes "grep", je pense que tous les ";[^;]*" après $var et jusqu'à la fin sont inutiles (sauf si tu veux valider que la ligne a 9 champs).
Par ailleurs, "[^;]*$var;" ne marchera que si ce que tu cherches est à la fin du champ. Si tu veux que ton élément de recherche puisse être trouvé n'importe où dans le champ, il faut mettre : "[^;]*$var[^;]*;"
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#30 Le 13/03/2013, à 20:23
- Totor
Re : [Résolu] choix pour des recherches dans des fichiers
credenhill a écrit :var=EneP; awk -F";" -v var=$var 'BEGIN{IGNORECASE=1} $1 ~ var {print}' dico.txti
C'est un peu plus compliqué que
grep "^$var;" dico.txt
Awk est tout aussi puissant (voire plus) que grep pour la recherche de pattern/regex. En outre, je rejoins largement credenhill sur son utilisation car il est doté d'un langage lui permettant de réaliser des traitements sur des flux évitant de multiples utilisations de grep (ou sed) à l'interieur des divers mechanismes de boucles fournis par le shell employé.
Dès lors que l'on a compris son fonctionnement, cela permet une plus grande souplesse dans les traitements de flux.
-- Lucid Lynx --
Hors ligne
#31 Le 13/03/2013, à 20:38
- tiramiseb
Re : [Résolu] choix pour des recherches dans des fichiers
Oui, "dès lors que l'on a compris son fonctionnement"... En 15 ans je n'ai toujours pas compris son fonctionnement
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#32 Le 14/03/2013, à 07:52
- ar barzh paour
Re : [Résolu] choix pour des recherches dans des fichiers
Pour tes "grep", je pense que tous les ";[^;]*" après $var et jusqu'à la fin sont inutiles
peut-être , dans le doute j'ai explicité jusqu'à la fin , j'y reviendrai peut-être
Par ailleurs, "[^;]*$var;" ne marchera que si ce que tu cherches est à la fin du champ. Si tu veux que ton élément de recherche puisse être trouvé n'importe où dans le champ, il faut mettre : "[^;]*$var[^;]*;"
oui c'est voulu
"[^;]*$var;" ==> se trouve dans SH_n_fin (contient $var; sauf pour le champ 10 où j'ai mis $var$
"[^;]*$var[^;]*;" ==> se trouve dans SH_n_cont (contient $var)
Awk est tout aussi puissant (voire plus) que grep pour la recherche de pattern/regex
c'est vrai , je pense , mais il me faudra plus de temps pour le mettre en oeuvre , par contre , il sera plus souple pour les analyses plus fines que je veux réaliser
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#33 Le 14/03/2013, à 08:34
- pingouinux
Re : [Résolu] choix pour des recherches dans des fichiers
@ar barzh paour :
Dans ton premier script en #28, tu peux remplacer la longue structure case … esac par ceci
# $2 est le numéro du champ dans lequel rechercher
n=$2
if (( n>=0 && n<=10 ));
then
while read lig
do
IFS=";" liste=( $lig )
egrep -q "^$var" <<<"${liste[$((n-1))]}" && echo "$lig"
done <"$fich"
else
echo "syntaxe incorrecte $0 \"chaine\" num"
echo " avec num = 0 1 2 3 4 5 6 7 8 9 ou 10"
fi
Ajouté :
Tu peux aussi remplacer la séquence
tmp1=…
tmp2=…
tmp3=…
var=…
par
var=$( sed -r 's/(\[|\(|\))/\\\1/' <<<"$1" )
ou, s'il peut y avoir plusieurs occurrences à remplacer
var=$( sed -r 's/(\[|\(|\))/\\\1/g' <<<"$1" )
Dernière modification par pingouinux (Le 14/03/2013, à 16:11)
Hors ligne