2010-01-26 7 views
0

Comment écrire une commande awk qui lit le fichier/etc/passwd et qui affiche uniquement les noms des utilisateurs ayant le programme/bin/bash comme shell de commande par défaut?Aide de la commande AWK

Répondre

4
cat /etc/passwd | awk -F ":" '$7=="/bin/bash" { print $1 }' 
+7

+1, mais l'utilisation inutile de chat! :-) 'awk -F: '$ 7 =="/bin/bash "{print $ 1}'/etc/passwd' –

+0

gbacon a raison, le chat n'est pas nécessaire. –

1

awk -F: '/\/bin\/bash$/{print $1}' /etc/passwd

+0

Alors/bin/bash est le même que/tmp/attack/bin/bash? –

+0

Bonne prise. Comme l'a fait Bear, la vérification contre l'ensemble du champ est une meilleure approche. – jamessan

+0

Puisque vous avez défini le délimiteur à ":", pourquoi vérifier la ligne entière pour bash? utiliser $ 7 – ghostdog74

3

Depuis c'est des devoirs, je ne vais pas écrire le programme pour vous (et je l'espère personne d'autre ne soit), mais voici ce que vous devez savoir:

  • Le séparateur de champ par défaut dans AWK est un espace; le séparateur de champ au /etc/passwd est un deux-points. Vous pouvez modifier le séparateur de champ dans AWK via la variable FS ou -F sur la ligne de commande.

  • Dans /etc/passwd/, le shell est listé dans le 7ème champ.

Eh bien, dans le temps qu'il m'a fallu pour écrire autant, deux personnes ont fait vos devoirs pour vous. Bonne chance!

+0

Oups, n'a pas remarqué l'étiquette de devoirs quand j'ai posté. – jamessan

0

@OP, vous pouvez utiliser awk

awk 'BEGIN{FS=":"}$7~/bash/{print $1}' /etc/passwd 

les contrôles ci-dessus pour bash, mais ne limite pas à/bin/bash. Si vous avez absolument besoin de/bin/bash, changez-le.

OU dire à votre professeur vous voulez juste utiliser le shell

#!/bin/bash 

while IFS=":" read -r user b c d e f sh h 
do 
    case "$sh" in 
     *bash*) echo $user;; 
    esac 
done <"/etc/passwd"