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?
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}'
_
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).