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

Gurú
fuente
7

En awk, podrías hacer uno de

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

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

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

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