2012-04-23 25 views
6

Soy realmente nuevo con bash, pero es uno de los temas en la escuela. Uno de los ejercicios fue:Bash: patrón grep de salida de comando

Dale el número de línea del archivo "/ etc/passwd", donde la información sobre su propio nombre de usuario es.

Supongamos USERNAME es mi propia ID de inicio de sesión, yo era capaz de hacerlo a la perfección de esta manera:

cat /etc/passwd -n | grep USERNAME | cut -f1 

que simplemente se le dio el número de línea requerido (que puede ser una forma más optimizada). Sin embargo, me preguntaba si había una manera de hacer el comando más general para que use la salida de whoami para representar el patrón grep, sin secuencias de comandos o usando una variable. En otras palabras, para evitar que un comando fácil de leer una sola línea, así:

cat /etc/passwd -n | grep (whoami) | cut -f1 

Lo siento si esto es una pregunta muy novato.

Respuesta

16
cat /etc/passwd -n | grep `whoami` | cut -f1 

Alrededor de un comando en `marcas hace ejecutar el comando y enviar el resultado en el comando está envuelto en.

+0

Bien, backticks ... Por supuesto :) ¡Gracias! – MarioDS

+1

Sin anclar, esto puede producir coincidencias falsas si su nombre de usuario coincide con otro en la línea. Solía ​​tener un nombre de inicio de sesión corto en un sistema local que casualmente coincidía (una subcadena de) "Operador del sistema", por lo que un software estúpido pensó que yo era "root" cuando no lo era. – tripleee

9

sustitución de comandos Comprobar en la página bash hombre.

Puede que volver garrapatas `` o $(), y personalmente prefiero este último.

Así que para su pregunta:

grep -n -e $(whoami) /etc/passwd | cut -f1 -d : 

sustituirá a la salida de whoami como el argumento de la bandera -e del comando grep y la salida de todo el comando será el número de línea en /etc/passwd del usuario que ejecuta .

+0

+1 porque funciona, pero la respuesta de Lynn es más clara para leer (al menos para un principiante como yo :)) pero me gusta que hayas indicado que debería usar el modificador -n de grep para acortarlo. – MarioDS

+4

+1, prefiero el constructo '$()' también, simplemente porque es mucho más fácil anidar. – paxdiablo

+0

+1 Para señalar ambas sintaxis :) –

10

Usted puede hacer esto con un solo awk invocación:

awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd 

En más detalle:

  • la -v crea una variable llamada awkme y lo llena con su nombre de usuario.
  • -F establece el separador de campo en : como corresponda al archivo de contraseña.
  • $1==me solo selecciona las líneas donde el primer campo coincide con su nombre de usuario.
  • print muestra el número de registro (línea).
+0

gracias por la gran explicación, pero por ahora parece que me ha avanzado para crear comandos así :) – MarioDS

+3

@Mario: cuanto antes empiece a aprender, más pronto lo hará ser capaz de cobrar tarifas exorbitantes por sus servicios de desarrollo :-) – paxdiablo

+0

+1 Por presumir awk a noobie –

Cuestiones relacionadas