J'ai un exemple de fichier / etc / passwd comme celui-ci:
tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
J'essaie de répertorier tous les utilisateurs avec un dossier de départ dans /home/
.
J'ai écrit
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
où e.txt est le texte que j'ai copié ici.
Je comprends qu'il y a un problème avec la barre oblique inverse qui est un caractère d'échappement, mais comment puis-je le corriger pour pouvoir les répertorier sur une seule ligne de commande?
cat
et de diriger vers des outils commeawk
oused
ou similaires, car ils peuvent être donnés le nom de fichier comme argument.grep home e.txt | cut -d ":" -f 1
. Félicitations pour votre prix UUOC. Cependant, ce n'est pas une bonne solution. Que faire s'il existe un service "homebackups" qui s'exécute sous un utilisateur distinct nommé d'après le démon? C'est un faux positif.cat > tool
variante de ces lignes de commande car elle peut améliorer la clarté en maintenant le flux de gauche à droite de l'entrée-traitement-sortie de la chaîne de tuyaux. Il est moins efficace, mais presque toujours de manière minimale. Il est également très évident d'ajouter une barre de progression lorsque cela est pertinent et utile lors de l'exécution interactive (il suffit de le remplacercat
parpv
s'il est installé).Réponses:
Vous pouvez échapper aux barres obliques comme indiqué ci-dessous:
Une autre astuce serait d'utiliser un séparateur de champ complexe:
-F'[:/]'
- traiter les deux:
et/
être un séparateur de champsla source
Vous pouvez utiliser des guillemets au lieu de
/
pour l'expression régulière, pour éviter d'échapper à/
:Avec
awk
,{if (foo) ... }
peut souvent être simplement simplifiéfoo {...}
.la source
En supposant que
e.txt
c'est en fait/etc/passwd
, vous devez réellement utilisergetent passwd
au lieu d'analyser le fichier car les informations de compte d'utilisateur peuvent être stockées à plusieurs emplacements spécifiés dans/etc/nsswitch.conf
LDAP.Notez que l'
print
instruction est implicite lorsque la condition est vraie. Cela imprimera cependant toute la ligne. Cela n'imprimera que le nom d'utilisateur:la source
Alternative pour ceux d'entre nous qui n'aiment tout simplement pas awk:
Explication:
grep -E
permet l'utilisation de quelques fonctionnalités d'expression régulière étendues([^:]*:)
correspond à une colonne, y compris le séparateur «:» suivant^([^:]*:){5}
correspond aux cinq premières colonnes de chaque ligne^([^:]*:){5}/home/
correspond à chaque ligne où la 6e colonne commence par '/ home /'cut -d: -f1
sélectionne uniquement la première colonne de son entrée, en utilisant:
comme séparateur de colonnela source
Vous pouvez également utiliser
index
pour une correspondance de chaîne fixe commegrep -F
et utiliser la valeur de retour pour vous assurer qu'elle correspond au début de la chaîneou si l'expression régulière est nécessaire, passez-la comme variable d'environnement
la source
Juste pour la variété
Explication
Variation si vous voulez être pointilleux sur l'endroit où
/home/
se trouvela source