Gostaria de obter a última coluna desta amostra:
[ 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
...
Se eu usar
cut -d\ -f 13
eu recebo
Mbits/sec
6.29
4.19
2.10
porque às vezes há espaços adicionais no meio.
text-processing
columns
cut
rubo77
fonte
fonte
Mbits/sec
: é isso que você deseja ou as 2 últimas colunas?Respostas:
Para responder sua pergunta literalmente:
ou
Mas isso não acontece se o número entre colchetes atingir 10, etc. Se você estiver interessado apenas nos números, poderá remover todo o resto.
fonte
| sed 's/ .*//'
no final dos dois primeiros exemplos. Claro que existem muitas outras maneiras de fazer isso.+
vez de*
: teste do gato | sed 's / [^. 0-9] \ + /: / g' | corte -d: -f 6+
e?
no ERE, mas deixa\+
e\?
no BRE indefinido.Se usarmos o
tr
comando junto com a opção squeeze (-s
flag) para converter todos os vários espaços consecutivos em um único espaço e, em seguida, executar acut
operação com espaço como delimitador - podemos acessar a coluna necessária que contém os números.Consulte o código abaixo:
cat file | tr -s ' ' | cut -d ' ' -f 8
fonte
Todos esses comandos imprimirão a última coluna de um arquivo separado por espaço:
awk '{print $NF}' file
in
awk
,NF
é o número de campos e$NF
é o último campo.perl -lane 'print $F[$#F]' file
-a
divide o arquivo no espaço em branco na matriz@F
,$#F
é o número de elementos na matriz, assim$F[$#F]
como o último elemento. Os-n
meios leem o arquivo fornecido na linha de comando e aplicam o script passado-e
a cada linha.-l
apenas adiciona um caractere de nova linha (\n
) a cadaprint
instrução.sed 's/.* //g'
uma expressão regular simples que combina tudo com o último espaço e o exclui, deixando apenas a última coluna.
rev file | cut -d' ' -f 1 | rev
rev
inverte sua saída para que o último campo seja o primeiro,cut
com espaço delimitador para imprimi-lo erev
reverter o texto de volta ao normal. Isso não funcionará se você tiver espaços em branco consecutivos .Com base em suas informações, acho que você não quer a última coluna, mas a penúltima ou as duas últimas. Nesse caso, use-os para imprimir os últimos 2 (
8.39 Mbits/sec
):e estes para imprimir o penúltimo (
8.39
):fonte
Você não pode separar várias ocorrências de espaços em branco usando o
cut
manual:a menos que o texto seja separado pela mesma quantidade ou você use
tr
para remover o excesso deles.Caso contrário, use ferramentas alternativas, como
awk
,sed
ouex
.Por exemplo:
Substitua
+q!
por-cwq
para salvar as alterações no local.fonte
Use um liner perl da seguinte maneira:
perl -lane 'print $F[-2]' input_file
Explicação:
A opção
-e
faz com que o intérprete perl procure o script embutido, e não em um arquivo.A opção
-n
faz com que a entrada (arquivo ou STDIN de um canal) seja lida linha por linha.A opção
-l
remove o separador de registros de entrada (dependente do SO, nova linha no UNIX por padrão) depois de ler a linha e a adiciona no final de cadaprint
A opção
-a
faz com que cada linha de entrada seja dividida em espaço em branco na matriz@F
e$F[-2]
é o segundo elemento contado a partir do final, que é o campo que você deseja. Você também pode usar$F[$#F-1]
, onde$#F
está o último índice da matriz@F
, que é um pouco menos legível.fonte