Respostas:
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 awk
a interpretar o 5º campo como um número, e qualquer coisa após o número será ignorado.
Observe que o GNU df
(você -h
já é 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%
{print +$5}
vai funcionar tão bem ...
awk
implementaçõ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.
Com sed
isso é 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/.$//'
sed
é redundante: isso pode ser feito em awk
:df -h | awk '{gsub(/%/,""); print $5}'
Eu tenho duas soluções:
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.
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)
No awk, você poderia fazer um dos
awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
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.
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
cut -d '%' -f1
qual é a resposta correta para obter tudo na linha até o primeiro '%'.
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
%
sinal?