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
Özzesh
fonte
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%
Stéphane Chazelas
fonte
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/.$//'
Bernhard
fonte
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)

Guru
fonte
7

No awk, você poderia fazer um dos

awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
Glenn Jackman
fonte
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.

Josh McGee
fonte
1
$ df -h | awk '{print $5}' | cut -d '%' -f1 
ashok
fonte
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

Chuss
fonte
1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
user223910
fonte
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

sudhir tataraju
fonte
0
echo "123" | perl -ple 'chop'
12
bsb
fonte