2011-01-17 25 views
6

Necesito obtener una fila basada en el valor de la columna al igual que consultar una base de datos. Tengo una salida de comando como este,Filtrando la salida del comando de Linux

identificación del nombre Mem VCPU Estado
Tiempo (s)

dominio-0 0 15 485 16 r ----- 1779042,1

prime95-01 512 1
-b ---- 61,9

Aquí tengo que enumerar sólo las filas donde el estado es "r". Algo como esto,

dominio-0 0 15485 16
r ----- 1779042,1

He intentado usar "grep" y "awk" pero todavía no soy capaz de tener éxito .

Por favor, ayúdenme en este tema.

Saludos, RAAJ

Respuesta

2

intento:

awk '$5 ~ /^r.*/ { print }' 

De esta manera:

cat file | awk '$5 ~ /^r.*/ { print }' 
+0

Muchas gracias. Esto ayudó a resolver mi problema. – Raajkumar

+3

@Raajkumar: Bienvenido a StackOverflow. Tómese un minuto para leer esta sección sobre cómo decimos 'muchas gracias' por aquí: http://stackoverflow.com/faq#howtoask – Johnsyweb

+0

@Raajkumar - tldr acepta la respuesta y voto positivo si desea – Ben

6

Hay una variaty de herramientas disponibles para el filtrado.

Si sólo desea líneas con "r -----" grep es más que suficiente:

command | grep "r-----" 

O

cat filename | grep "r-----" 

Cotizaciones son opcionales, pero pueden evitar tropezar con el grep - 's solución

+0

"Las cotizaciones son opcionales, pero podría evitar que grep se tropiece con el -'s "They are. Pero no lo harán. – Johnsyweb

0

grep:

command | grep -E "^([^ ]+){4}r" 

Qué hace esto (-E cambia en expresiones regulares extendidas):

El primer símbolo de intercalación (^) coincide con el comienzo de la línea. [^] coincide exactamente con una ocurrencia de un carácter que no sea de espacio, el siguiente modificador (+) también permite que coincida con más ocurrencias.

Agrupado junto con el espacio final en ([^] +), coincide con cualquier secuencia de caracteres que no sean espacios seguidos de un espacio simple. El modifyer {4} requiere que esta construcción coincida exactamente cuatro veces.

La "r" individual es entonces el carácter literal que está buscando.

En palabras simples, esto podría escribirse como "Si la línea comienza < ^> con cuatro cadenas seguidas por un espacio < ([^] +) {4}> y el siguiente carácter es, entonces la línea coincide .. "

Una muy buena introducción en expresiones regulares ha sido escrito por Jan Goyvaerts (http://www.regular-expressions.info/quickstart.html)

2

grep puede manejar esto para usted:

yourcommand | grep -- 'r-----' 

a menudo es útil para guardar la salida (completo) en un archivo de analizar más adelante. para ello utilizo tee.

yourcommand | tee somefile | grep 'r-----' 

Si desea fi nd la línea que contiene "-b ----" un poco más adelante sin volver a ejecutar yourcommand, sólo puede utilizar:

grep -- '-b----' somefile 

No hay necesidad de cat aquí!

Recomiendo poner -- después de su llamada a grep ya que sus patrones contienen menos signos y si el signo menos está al principio del patrón, esto se vería como un argumento opción de grep en lugar de una parte del patrón .

+0

@downvoter: ¿Por qué? – Johnsyweb

+1

Esto no funciona – Tyguy7

+0

¿Qué pieza no funciona? Lo hice cuando lo escribí hace casi siete años, pero me complace actualizarlo si puede señalar el error. – Johnsyweb

0

Filtrado por cmd awk en Linux: -

En primer lugar encontramos la columna para este cmd y almacenar fichero2: -

awk '/ dominio-0 0 15485 /' archivo1> fichero2

de salida: -

Domain-0 0 15 485 16 r ----- 1779042,1

después de que cmd awk en archivo2: -

awk '{print $ 1, $ 2, $ 3, $ 4, "\ n", $ 5, $ 6}' fichero2

salida final: -

Domain-0 0 15485 16

r ----- 1779042.1

Cuestiones relacionadas