Tengo un ejemplo de archivo / etc / passwd como este:
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
Estoy tratando de enumerar todos los usuarios con una carpeta de inicio /home/
.
escribí
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
donde e.txt es el texto que copié aquí.
Entiendo que hay un problema con la barra diagonal inversa que es un carácter de escape, pero ¿cómo lo soluciono para poder enumerarlos en una línea de un comando?
text-processing
awk
wildcards
passwd
erans
fuente
fuente
cat
y canalizar herramientas comoawk
osed
similares, ya que se les puede dar el nombre de archivo como argumento.grep home e.txt | cut -d ":" -f 1
. Felicitaciones por su premio UUOC. Sin embargo, esta no es una buena solución. ¿Qué pasa si hay un servicio de "homebackups" que se ejecuta bajo un usuario separado llamado así por el demonio? Eso es un falso positivo.cat > tool
variante de tales líneas de comando porque puede mejorar la claridad al mantener el flujo de izquierda a derecha de la entrada-procesamiento-salida de la cadena de tuberías. Que es menos eficiente, pero casi siempre de manera mínimamente. También hace que añadir una barra de progreso cuando sea pertinente y útil cuando se ejecuta de forma interactiva muy evidente (basta con sustituircat
conpv
si está instalado).Respuestas:
Puede escapar de las barras diagonales como se muestra a continuación:
Otro truco sería usar un separador de campo complejo:
-F'[:/]'
- tratar a ambos:
y/
ser un separador de campofuente
Puede usar comillas en lugar de
/
para la expresión regular, para evitar escapar de/
:Con
awk
, a{if (foo) ... }
menudo se puede simplificar a solofoo {...}
.fuente
Suponiendo que
e.txt
es realmente/etc/passwd
, debería usarlo engetent passwd
lugar de analizar el archivo, ya que la información de la cuenta de usuario puede almacenarse en múltiples ubicaciones especificadas/etc/nsswitch.conf
, como LDAP.Tenga en cuenta que la
print
declaración está implícita cuando la condición es verdadera. Sin embargo, eso imprimirá toda la línea. Esto imprimirá solo el nombre de usuario:fuente
Alternativa para aquellos de nosotros que simplemente no nos gusta awk:
Explicación:
grep -E
permite el uso de algunas características extendidas de expresión regular([^:]*:)
coincide con una columna, incluido el siguiente separador ':'^([^:]*:){5}
coincide con las primeras cinco columnas de cada línea^([^:]*:){5}/home/
coincide con cada línea donde la sexta columna comienza con '/ home /'cut -d: -f1
selecciona solo la primera columna de su entrada, utilizando:
como separador de columnafuente
También puede usar
index
una coincidencia de cadena fija comogrep -F
y usar el valor de retorno para asegurarse de que coincida con el inicio de la cadenao si se necesita regex, páselo como variable de entorno
fuente
Solo por variedad
Explicación
Variación si quieres ser exigente sobre dónde
/home/
se encuentrafuente