Me gustaría obtener la última columna de esta muestra:
[ 3] 1.0- 2.0 sec 1.00 MBytes 8.39 Mbits/sec
[ 3] 2.0- 3.0 sec 768 KBytes 6.29 Mbits/sec
[ 3] 3.0- 4.0 sec 512 KBytes 4.19 Mbits/sec
[ 3] 4.0- 5.0 sec 256 KBytes 2.10 Mbits/sec
...
Si yo uso
cut -d\ -f 13
yo obtengo
Mbits/sec
6.29
4.19
2.10
porque a veces hay espacios adicionales en el medio.
text-processing
columns
cut
rubo77
fuente
fuente
Mbits/sec
, ¿es eso lo que quieres o las 2 últimas columnas?Respuestas:
Para responder a su pregunta literalmente:
o
Pero eso no funcionará si el número entre paréntesis llega a 10, etc. Si solo le interesan los números, puede eliminar todo lo demás.
fuente
| sed 's/ .*//'
al final de los dos primeros ejemplos. Por supuesto, hay muchas otras formas de hacerlo.+
lugar de*
: prueba de gato | sed 's / [^. 0-9] \ + /: / g' | cut -d: -f 6+
y?
en ERE pero deja\+
y\?
en BRE indefinido.Si usamos el
tr
comando junto con la opción de compresión (-s
bandera) para convertir todos los espacios consecutivos múltiples en un solo espacio y luego realizar lacut
operación con el espacio como delimitador, podemos acceder a la columna requerida con los números.Consulte el código recortado a continuación:
cat file | tr -s ' ' | cut -d ' ' -f 8
fuente
Todos estos comandos imprimirán la última columna de un archivo separado por espacios:
awk '{print $NF}' file
en
awk
,NF
es el número de campos y$NF
es el último campo.perl -lane 'print $F[$#F]' file
-a
divide el archivo en el espacio en blanco en la matriz@F
,$#F
es el número de elementos en la matriz, por lo que$F[$#F]
es el último elemento. Los-n
medios leen el archivo dado en la línea de comando y aplican el script pasado con-e
a cada línea.-l
simplemente agrega un carácter de nueva línea (\n
) a cadaprint
declaración.sed 's/.* //g'
una expresión regular simple que hace coincidir todo con el último espacio y lo elimina, dejando solo la última columna.
rev file | cut -d' ' -f 1 | rev
rev
invierte su salida para que el último campo sea el primero,cut
con espacio delimitador para imprimirlo yrev
volver el texto a la normalidad. Esto no funcionará si tiene espacios en blanco consecutivos .Según su aporte, supongo que en realidad no desea la última columna, sino la penúltima o las dos últimas. En ese caso, utilice estos para imprimir los últimos 2 (
8.39 Mbits/sec
):y estos para imprimir el penúltimo (
8.39
):fuente
No puede separar la aparición múltiple de espacios en blanco usando
cut
según el manual:a menos que el texto esté separado por la misma cantidad o que utilice
tr
para eliminar el exceso de ellos.De lo contrario, use herramientas alternativas como
awk
,sed
oex
.Por ejemplo:
Reemplace
+q!
con-cwq
para guardar los cambios en el lugar.fuente
Use un perl one-liner de esta manera:
perl -lane 'print $F[-2]' input_file
Explicación:
La opción
-e
hace que el intérprete perl busque la secuencia de comandos en línea, en lugar de en un archivo.La opción
-n
hace que la entrada (archivo o STDIN de una tubería) se lea línea por línea.Opción
-l
elimina el separador de registro de entrada (dependiente del sistema operativo, nueva línea en UNIX por defecto) después de leer la línea, y lo agrega al final de cadaprint
La opción
-a
hace que cada línea de entrada se divida en el espacio en blanco en una matriz@F
, y$F[-2]
es el segundo elemento que cuenta desde el final, que es el campo que desea. También puede usar$F[$#F-1]
, donde$#F
es el último índice de la matriz@F
, que es ligeramente menos legible.fuente