Toma ciertos contenidos de un archivo


9

Así que sé que existen herramientas para este problema porque he oído hablar de ellas, pero no sé cuáles son.

Quiero hacer algo como filtrar todos los datos excepto los nombres de usuario en / etc / passwd.

Por ejemplo, me gustaría tomar user1, user2 y user3 del siguiente archivo. En este caso, la lógica podría ser "Capturar texto hasta el primer ':' en cada línea del archivo".

user1:x:1:4
user2:x:2:5
user3:x:3:6

El resultado sería:

user1
user2
user3

Respuestas:


19

cutexiste exactamente para este propósito. La -dbandera especifica el delimitador y -fespecifica qué campos generar:

cut -d: -f1 /etc/passwd

El argumento para -fpuede ser algo como 1,3mostrar el primer y tercer campo, o 1-3mostrar los primeros tres; también existen -by -cbanderas para leer bytes y caracteres en lugar de campos. Si necesita algo más flexible, generalmente awkhará el truco (vea la respuesta de Matthew )


13

Cada vez que desee extraer datos de una entrada tabular, debe considerar awk . Está disponible en prácticamente todos los sistemas Unix, por lo que es un buen hábito tomar:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': define ":" como el delimitador de columna.
  • '{}': ejecuta esta instrucción para cada línea.
  • print $1: imprime la primera columna en la pantalla.

3
Nota aleatoria: awktoma un nombre de archivo, para que pueda saltear la tubería y simplemente hacerloawk -F: '{print $1}' /etc/passwd
Michael Mrozek

Siempre me parece olvidar que awk toma un nombre de archivo, siempre parece usarlo en una tubería ... algo así como sed | awk, etc ...
Matthew Brannigan

Casi todo lo que funciona con archivos toma un nombre de archivo ( try atson un par de ejemplos de las pocas cosas que no lo hacen).
Pausado hasta nuevo aviso.

3

Aquí hay una línea de Perl:

perl -F/:/ -lane 'print $F[0]' /etc/passwd

1

Debajo de perl y awk, hay una tercera herramienta para tales trabajos, que es sed:

sed 's/:.*//' FILE 

Este es el comando de sustitución: sustituto de dos puntos:, seguido de un punto, que es un comodín para caracteres de cualquier tipo, de cualquier cuenta (*), sin nada.

Es 's (ubstitute) / FROM / TO /' con TO vacío, lo que significa 'eliminar todo desde el primer colon (ya que sed es codicioso por defecto) (hasta el final de la línea, ya que sed funciona bien con líneas enteras).

Por supuesto, cutes un buen comando también, pero diría que de una familia diferente.


1

En su ejemplo, los 3 nombres tienen la misma longitud. En tales casos, lo que podría suceder, pero no es tan probable con / etc / passwd, también puede usar colrm:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

o por supuesto

cat FILE | colrm 6 

(un caso raro en el useless use of catque no se aplica, porque no se puede colmar un ARCHIVO para actuar como parámetro).


catsigue siendo inútil allí: colrm 6 < FILE.
manatwork

Bueno, sí, pero no tan inútil, como en llamar cat foo | grep bar.
usuario desconocido

1

Solo para completar, no hay necesidad de comandos externos, el shell (Bourne shell o compatible) puede manejarlo solo:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

Por supuesto, esta es probablemente la solución más lenta posible, por lo que para archivos de gran tamaño, elija otra.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.