Remove o último caractere da linha

41

Eu quero remover o último caractere de uma linha:

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%

Resultado esperado:

Use
22
1
1
59
51
63
5
    
por Özzesh 15.07.2013 / 07:46

9 respostas

66

sed 's/.$//'

Para remover o último caractere. Mas você também pode fazer:

df -Ph | awk 'NR > 1 {print $5+0}'

Com a expressão aritmética ( $5+0 ) forçamos awk a interpretar o 5º campo como um número, e qualquer coisa após o número será ignorada.

    
por 15.07.2013 / 07:56
13

Com sed , isso é muito fácil:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5

A sintaxe é s(ubstitute)/search/replacestring/ . O . indica qualquer caractere e o $ no final da linha. Então, .$ removerá apenas o último caractere.

Nesse caso, seu comando completo ficaria:

df -h | awk '{ print $5}' | sed 's/.$//'
    
por 15.07.2013 / 07:58
10

Eu tenho duas soluções:

  1. corte: echo "somestring1" | rev | cut -c 2- | rev

    Aqui você inverte a string e corta a string do 2º caractere e inverte novamente.

  2. sed: echo "somestring1" | sed 's/.$//'

    Aqui, você procurará pela expressão regular .$ , que significa todos os caracteres seguidos por um último caractere e substituirá por nulo // (entre as duas barras)

por 12.08.2015 / 09:28
6

No awk, você pode fazer um

awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
    
por 15.07.2013 / 12:37
2

outra abordagem:

mapfile -t list < <(df -h)
printf '%s\n' "${list[@]%?}"

Transforme isso em uma função:

remove_last() {
  local char=${1:-?}; shift
  mapfile -t list < <("$@")
  printf '%s\n' "${list[@]%$char}"
}

Depois, chame assim:

remove_last '%' df -h

mapfile é um recurso bash4.

O problema aqui é que você deve fornecer um caractere para remover; Se você quer que seja apenas qualquer que seja o último caractere a ser , você deve passar '?' ou '' . citações necessárias.

    
por 25.07.2013 / 09:27
1
$ df -h | awk '{print $5}' | cut -d '%' -f1 
    
por 17.08.2016 / 12:21
1

Tente com isso:

df -h | awk  '{ print $5 }' | sed "s/%//"

O uso normal é: (ie)

VALUE=987654321
echo X123456789X | sed "s/123456789/${VALUE}/"

A resposta deve ser: X987654321X

    
por 27.03.2017 / 06:37
1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
    
por 01.04.2017 / 21:48
0
sed -ie '$d' filename

here -i is to write changes
      e means expression
      $ means last line
      d means delete

Note:Without -e option $ wont work

Opcional : Para excluir a primeira e última linha, use sed -ie '1d;$d' filename

    
por 24.10.2018 / 20:44