Remover o último caractere da linha


54

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

2
Sempre é um %sinal?
10243 Bernhard

Respostas:


83
sed 's/.$//'

Para remover o último caractere.

Mas neste caso específico, você também pode:

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

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

Observe que o GNU df(você -hjá é uma extensão GNU, embora não seja necessário aqui) também pode ser instruído a gerar apenas a porcentagem de uso do disco:

df --output=pcent | tail -n +2 | tr -cd '0-9\n'

(tail ignora os cabeçalhos e tr remove tudo, exceto os dígitos e os delimitadores de linha).

No Linux, veja também:

findmnt -no USE%

9
{print +$5}vai funcionar tão bem ...
jasonwryan

11
@jasonwryan, infelizmente, existem muitas awkimplementações em que isso não funciona , onde o +operador unário é apenas ignorado e não força a conversão de strings em numéricas.
Stéphane Chazelas

20

Com sedisso é bem 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 fim da linha. Então .$, removerá apenas o último caractere.

Nesse caso, seu comando completo seria:

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

2
O tubo para sedé redundante: isso pode ser feito em awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan Então, eu gosto mais da solução de Stephane.
21913 Bernhard

15

Eu tenho duas soluções:

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

    Aqui você inverte a sequência e corta a sequência do segundo caractere e reverte novamente.

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

    Aqui, você procurará por expressões regulares, o .$que significa qualquer caractere seguido por um último caractere e o substituirá por nulo //(entre as duas barras)


7

No awk, você poderia fazer um dos

awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'

2

outra abordagem:

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

Transforme-o em uma função:

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

Então chame assim:

remove_last '%' df -h

mapfile é um recurso do bash4.

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


1
$ df -h | awk '{print $5}' | cut -d '%' -f1 

1

Tente com isto:

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

O uso normal é: (ie)

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

A resposta deve ser: X987654321X


1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1

Esta resposta poderia ser mais útil para outras pessoas além do OP se você poderia fornecer um pouco de explicação sobre como ele funciona e, possivelmente, por que isso pode ser melhor do que as alternativas
Fox

Bem-vindo ao Unix Stackexchange! Você pode fazer o tour para ter uma ideia de como este site funciona. Ao dar uma resposta, é preferível dar uma explicação sobre POR QUE sua resposta é a que o leitor deseja. Isso significa que é melhor se você der uma explicação de como funciona. Se você olhar acima, verá que todas as respostas altamente votadas explicam o código.
Stephen Rauch

Votado para o uso de cut -d '%' -f1qual é a resposta correta para obter tudo na linha até o primeiro '%'.
precisa

Além disso, eu só acreditam nocivos / respostas erradas deve começar sempre downvoted abaixo de 0.
Titou

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 a última linha, use sed -ie '1d;$d'filename


0
echo "123" | perl -ple 'chop'
12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.