Eliminar el último caracter de la línea


54

Quiero eliminar el último caracter de una línea:

[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
¿Es siempre una %señal?
Bernhard

Respuestas:


83
sed 's/.$//'

Para eliminar el último personaje.

Pero en este caso específico, también podría hacer:

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

Con la expresión aritmética ( $5+0) forzamos awka interpretar el quinto campo como un número, y cualquier cosa después del número será ignorado.

Tenga en cuenta que a GNU df(su -hya es una extensión de GNU, aunque no se necesita aquí) también se le puede decir que solo muestre el porcentaje de uso del disco:

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

(la cola omite los encabezados y tr elimina todo menos los dígitos y los delimitadores de línea).

En Linux, vea también:

findmnt -no USE%

99
{print +$5}funcionará bien ...
jasonwryan

1
@jasonwryan, desafortunadamente, hay muchas awkimplementaciones donde eso no funciona , donde el +operador unario simplemente se ignora y no fuerza la conversión de cadenas a números.
Stéphane Chazelas

20

Con sedesto es bastante fácil:

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

La sintaxis es la siguiente s(ubstitute)/search/replacestring/. El .indica cualquier carácter, y $el final de la línea. Entonces .$eliminará solo el último carácter.

En este caso, su comando completo se vería:

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

2
La tubería a sedes redundante: se puede hacer en awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan Entonces me gusta más la solución de Stephane.
Bernhard

15

Tengo dos soluciones:

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

    Aquí invierte la secuencia y corta la secuencia del segundo carácter y vuelve a invertir.

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

    Aquí buscará una expresión regular .$que significa cualquier carácter seguido de un último carácter y lo reemplazará por nulo //(entre las dos barras)


7

En awk, podrías hacer uno de

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

2

otro enfoque:

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

Conviértalo en una función:

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

Entonces llámalo así:

remove_last '%' df -h

mapfile es una característica bash4.

El problema aquí es que debes proporcionar un personaje para eliminar; si quieres que sea lo que sea ​​el último personaje , debes pasar '?'o ''. Se requieren cotizaciones.



1

Prueba con esto:

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

El uso normal es: (es decir)

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

La respuesta debe ser: X987654321X


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

Esta respuesta podría ser más útil para otros más allá de OP Si pueden aportar un poco de explicación sobre cómo funciona y por qué esto posiblemente podría ser mejor que las alternativas
Fox

¡Bienvenido a Unix Stackexchange! Puede hacer el recorrido para tener una idea de cómo funciona este sitio. Al dar una respuesta, es preferible dar una explicación de POR QUÉ su respuesta es la que desea el lector. Esto significa que es mejor si da una explicación de cómo funciona. Si mira arriba, verá que todas las respuestas altamente votadas explican el código.
Stephen Rauch

Votó por el uso de la cut -d '%' -f1cual es la respuesta correcta para obtener todo en la línea hasta el primer '%'.
Titou

Además, creo que solo las respuestas dañinas / incorrectas deberían ser rechazadas por debajo 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 eliminar la primera y última línea, utilice el sed -ie '1d;$d'nombre del archivo


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.