web-dev-qa-db-fra.com

Que fait grep?

Voici la description de grep de GNU.org :

grep recherche dans les fichiers d'entrée les lignes contenant une correspondance avec une liste de motifs donnée. Lorsqu'il trouve une correspondance dans une ligne, il la copie sur la sortie standard (par défaut) ou génère le type de sortie que vous avez demandé avec des options.

J'ai cette commande que j'utilise souvent, qui donne le nom du moniteur actuellement connecté:

xrandr | grep " connected " | awk '{ print$1 }'

Je ne vois aucun fichier dans cette commande, ni aucun lien avec eux, alors que se passe-t-il exactement? Est-ce que grep est utilisé pour autre chose que la recherche de fichiers?

5
TellMeWhy

De man grep (c'est moi qui souligne):

_grep  searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing  a  match to the given PATTERN.  By default, grep prints the
matching lines.
_

Et de les GNU docs (encore une fois, c'est moi qui souligne):

2.4 Programmes grep

grep recherche dans les fichiers d'entrée nommés les lignes contenant une correspondance avec le motif donné. Par défaut, grep affiche les lignes correspondantes. Un fichier nommé _-_ représente l’entrée standard. Si aucune entrée n'est spécifiée , grep recherche le répertoire de travail _._ s'il dispose d'une option de ligne de commande spécifiant la récursion; sinon, grep recherche l'entrée standard .

L'entrée standard, dans ce cas, est le tuyau connecté à la sortie standard de xrandr.

La grep est superflue dans ce cas; awk peut faire le travail tout seul:

_xrandr | awk '/ connected /{print $1}'
_
14
muru

Quand tu fais:

xrandr | grep " connected "

vous redirigez en principe la sortie standard (descripteur de fichier 1, /dev/stdout) de xrandr vers l’entrée standard (descripteur de fichier 0, /dev/stdin) de grep, c’est le job de la pipe.

Comme grep prend les entrées à partir des entrées standard quand aucun nom de fichier n’est donné, votre commande réussira en ce qui concerne le fichier.

Vous pouvez penser à cela comme:

grep 'pattern' /dev/stdin

Vous pouvez obtenir la sortie désirée avec grep seul (pas besoin de awk):

% xrandr | grep -Po '^[^ ]+(?= connected)'
LVDS1

Cela donnera le premier mot de la ligne séparé par un espace (^[^ ]+) suivi d'un espace, puis le mot connected ((?= connected) est un motif d'affichage positif de largeur nulle garantissant <space>connected est apparié après la partie désirée).

10
heemayl