Entfernen Sie das letzte Zeichen aus der Zeile


54

Ich möchte das letzte Zeichen aus einer Zeile entfernen:

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%

Erwartetes Ergebnis:

Use
22
1
1
59
51
63
5

2
Ist es immer ein %Zeichen?
Bernhard

Antworten:


83
sed 's/.$//'

Das letzte Zeichen entfernen.

In diesem speziellen Fall können Sie jedoch auch Folgendes tun:

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

Mit dem arithmetischen Ausdruck ( $5+0) erzwingen wir awk, das 5. Feld als Zahl zu interpretieren, und alles nach der Zahl wird ignoriert.

Beachten Sie, dass GNU df(Ihre -hist bereits eine GNU-Erweiterung, hier jedoch nicht erforderlich) auch angewiesen werden kann, nur den Prozentsatz der Festplattennutzung auszugeben:

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

(tail überspringt die Überschriften und tr entfernt alles außer den Ziffern und den Zeilenbegrenzern).

Unter Linux siehe auch:

findmnt -no USE%

9
{print +$5}wird auch funktionieren ...
Jasonwryan

1
@jasonwryan, leider gibt es viele awkImplementierungen, bei denen das nicht funktioniert , bei denen der +unäre Operator einfach ignoriert wird und die Konvertierung von Strings in numerische nicht erzwingt .
Stéphane Chazelas

20

Mit sedist das ziemlich einfach:

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

Die Syntax lautet s(ubstitute)/search/replacestring/. Das .kennzeichnet ein beliebiges Zeichen und $das Ende der Zeile. So .$wird nur das letzte Zeichen entfernt.

In diesem Fall würde Ihr vollständiger Befehl folgendermaßen aussehen:

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

2
Die Pipe zu sedist überflüssig: Es kann getan werden in awk:df -h | awk '{gsub(/%/,""); print $5}'
Jasonwryan

@jasonwryan Dann gefällt mir Stephanes Lösung besser.
Bernhard

15

Ich habe zwei Lösungen:

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

    Hier kehren Sie die Zeichenfolge um und schneiden die Zeichenfolge vom 2. Zeichen ab und kehren sie erneut um.

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

    Hier suchen Sie nach regulären Ausdrücken .$, dh Zeichen, auf die ein letztes Zeichen folgt, und ersetzen es durch Null //(zwischen den beiden Schrägstrichen).


7

In awk könnten Sie eines von tun

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

2

Ein anderer Ansatz:

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

Verwandle es in eine Funktion:

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

Dann nenne es so:

remove_last '%' df -h

mapfile ist eine bash4 Funktion.

Der Haken dabei ist, dass Sie ein Zeichen angeben müssen, um es zu entfernen. wenn du willst, dass es genau das ist, was das letzte Zeichen ist, musst du '?'oder übergeben ''. Anführungszeichen erforderlich.



1

Versuchen Sie es mit diesem:

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

Der normale Gebrauch ist:

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

Die Antwort sollte lauten: X987654321X


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

Diese Antwort könnte für andere außerhalb von OP hilfreicher sein, wenn Sie ein wenig erläutern könnten, wie es funktioniert und warum dies möglicherweise besser ist als die Alternativen
Fox

Willkommen bei Unix Stackexchange! Sie können die Tour machen , um ein Gefühl dafür zu bekommen, wie diese Seite funktioniert. Wenn Sie eine Antwort geben, ist es vorzuziehen, zu erklären, WARUM Ihre Antwort die ist, die der Leser wünscht. Das heißt, es ist am besten, wenn Sie erklären, wie es funktioniert. Wenn Sie nach oben schauen, werden Sie sehen, dass alle Antworten mit hoher Stimmenzahl den Code erklären.
Stephen Rauch

Upvoted, dessen Verwendung cut -d '%' -f1die richtige Antwort ist, um alles in der Zeile bis zum ersten '%' zu bringen.
Titou

Außerdem glaube ich, dass nur schädliche / falsche Antworten jemals unter 0
herabgestuft werden

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

Optional : Verwenden Sie zum Löschen der ersten und letzten Zeile den sed -ie '1d;$d'Dateinamen


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.