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

Guru
quelle
7

In awk könnten Sie eines von tun

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

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

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

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