Comment fonctionne grep?
Je suis en train d'essayer de comprendre comment grep
œuvres.
Quand je dis grep "hello" *.*
ne grep
obtenir 2 arguments: (1) chaîne à rechercher c'est à dire "bonjour" et (2) chemin *.*
? Ou de l'interpréteur de commandes convertir *.*
dans quelque chose qui grep
peut comprendre?
Où puis-je obtenir le code source de grep
? Je suis tombé sur ce GNU grep
lien. L'un des fichiers lisez-moi, dit son différent de unix grep
. Comment donc?
Je veux regarder à la source de la version de FreeBSD de grep
et aussi la version Linux (si elles sont différentes).
source d'informationauteur hari
Vous devez vous connecter pour publier un commentaire.
Le shell ne le globbing (conversion de
*
forme de noms de fichiers). Vous pouvez le voir en si vous avez un simple programme C:Et puis exécutez-le comme ceci:
Vous verrez qu'il imprime à quoi correspondait, pas
*
littéralement. Si vous l'appelez comme ceci:Vous verrez qu'il devient un littéral
*
.La puissance de
grep
est la magie de la théorie des automates. GREP est une abréviation de Global Regular Expression Print. Et il fonctionne par la construction d'un automate (un très simple "machine virtuelle": pas de Turing); ensuite, il "exécute" l'automate contre le flux d'entrée.L'automate est un graphique ou d'un réseau de nœuds ou d'états. La transition entre les états est déterminée par le caractère d'entrée sous les projecteurs. Spécial des automates comme
+
et*
travail en ayant des transitions en boucle à eux-mêmes. Les classes de caractères comme[a-z]
sont représentés par un fan: un nœud de départ avec des branches pour chaque caractère à l'ordre de "rayons"; et en général, les rayons ont une spéciale "epsilon transition" pour un seul état final de sorte qu'il peut être lié avec la prochaine automate à être construit à partir de l'expression régulière (la chaîne de recherche). L'epsilon-transitions permettent un changement d'état sans aller de l'avant dans la chaîne de recherche en cours.Edit: Il semble que je n'ai pas lu la question de très près.
Lorsque vous tapez une ligne de commande, il est d'abord pré-traités par le shell. Le shell effectue alias substitutions et des jokers. Après la substitution des alias (ils sont comme les macros), le shell côtelettes de la ligne de commande dans une liste d'arguments (délimité par un espace). Cette liste d'arguments est passé à la
main()
fonction de la commande exécutable du programme comme un nombre entier (souvent appelé argc) et un pointeur vers un NUL ((void *)0
) tableau de nul de terminaison ('\0'
) des tableaux de char.Commandes individuelles rendent l'utilisation de leurs arguments toutefois ils le souhaitent. Mais la plupart des programmes Unix permettra d'imprimer un sympathique message d'aide si compte tenu de la
-h
argument (car il commence avec un signe moins, cela s'appelle une option). GNU logiciel permettra aussi accepter une "forme longue" option--help
.Puisqu'il y a un grand nombre de différences entre les différentes versions de programmes Unix le moyen le plus fiable pour découvrir la syntaxe exacte d'un programme est de demander le programme lui-même. Si ce n'est pas de vous dire ce que vous avez besoin (ou c'est trop cryptique pour comprendre), il convient ensuite de vérifier la local page de manuel (
man grep
). Et pour les logiciels gnu, vous pouvez souvent obtenir plus d'informations à partir deinfo grep
.Le shell étend la "
*.*
" dans une liste de noms de fichiers et passe à l'élargissement de la liste des noms de fichier pour le programme tel quegrep
. Legrep
programme lui-même ne fait pas l'expansion de noms de fichiers.Alors, pour répondre à votre question:
grep
ne pas faire 2 arguments; la coquille de convertis*.*
' en quelque chose degrep
peut comprendre.GNU
grep
est différente à partir d'Unixgrep
dans le soutien à des options supplémentaires, telles que-w
et-B
et-A
.Il me semble que FreeBSD utilise la version GNU de
grep
:Comment grep voit le générique argument dépend de votre shell. (Standard) Bourne shell dispose d'un commutateur (-f) pour désactiver le nom de fichier d'expansion (voir les pages de man).
Vous pouvez activer ce commutateur dans un script avec