Presque ça.
Grep va effectivement chercher les lignes contenant le motif indiqué dans le fichier /etc/passwd; sort nous trie les résultats par ordre alphabétique (sort = trier en anglais), puis c'est wc -l qui nous donne le nombre de lignes du tout.
Vous avez vu le concept des pipes/tuyaux (|) je présume? C'est ici le principe: si tu avais fait un wc -l directement sur le fichier, tu aurais eu son nombre total de lignes; les autres étapes dans la chaîne des pipes sont donc là pour filtrer peu à peu les résultats, et donc obtenir celui que tu veux. Ici, je présume qu'on vous a fait faire ça pour trouver le nombre d'utilisateurs qui utilisent le shell '/bin/sh' (puisque le fichier /etc/passwd contient tout un tas d'infos sur les utilisateurs du system; les mots de passe n'y sont pas vraiment stockés, seul un 'x' apparaît pour dire qu'ils sont cryptés dans un autre fichier). Tu vois donc que 18 utilisateurs utilisent /bin/sh comme shell sur ton système.
Si c'est bien ça qu'on voulait vous montrer, tu pourras dire à ton prof que cette commande est pas sécurisée (en plus d'être pas optimisée comme je t'expliquais page précédente) et qu'elle peut conduire à de faux positifs, parce que ce fichier contient aussi des commentaires arbitraires sur les utilisateurs (5eme champ). Ce qui veut dire que si un utilisateur utilisait, par exemple, le shell '/bin/bash' (donc pas sh, celui que tu cherches), mais avait en commentaire "J'ai horreur de /bin/sh !!!", grep l'aurait quand même compté, parce que sa ligne contient bien /bin/sh. Pourtant, il n'utilise pas /bin/sh, il utilise /bin/bash!
Pour éviter ça, il aurait fallu t'assurer de ne sélectionner que le dernier champ (celui contenant le shell utilisé), avec la commande 'awk', mais c'est un peu plus compliqué à manipuler.
Voilà voilà, j'espère que t'as compris et que pour les prochaines fois tu auras le réflexe de décomposer et chercher pas à pas 