Rimuovi l'ultimo carattere dalla riga


54

Voglio rimuovere l'ultimo carattere da una riga:

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

Risultato atteso:

Use
22
1
1
59
51
63
5

2
È sempre un %segno?
Bernhard,

Risposte:


83
sed 's/.$//'

Per rimuovere l'ultimo carattere.

Ma in questo caso specifico, potresti anche fare:

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

Con l'espressione aritmetica ( $5+0) forziamo awka interpretare il 5 ° campo come un numero e qualsiasi cosa dopo il numero verrà ignorata.

Nota che GNU df(la tua -hè già un'estensione GNU, sebbene non sia necessaria qui) può anche essere detto di produrre solo la percentuale di utilizzo del disco:

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

(la coda salta le intestazioni e tr rimuove tutto tranne le cifre e i delimitatori di linea).

Su Linux, vedi anche:

findmnt -no USE%

9
{print +$5}funzionerà anche ...
Jasonwryan,

1
@jasonwryan, sfortunatamente, ci sono molte awkimplementazioni in cui ciò non funziona , in cui l' +operatore unario viene semplicemente ignorato e non impone la conversione delle stringhe in valori numerici.
Stéphane Chazelas,

20

Con sed, questo è abbastanza facile:

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

La sintassi è s(ubstitute)/search/replacestring/. Il .indica qualsiasi carattere, e la $fine della linea. Quindi .$rimuoverà solo l'ultimo carattere.

In questo caso, il comando completo dovrebbe apparire:

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

2
Il pipe to sedè ridondante: può essere fatto in awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan Allora mi piace di più la soluzione di Stephane.
Bernhard,

15

Ho due soluzioni:

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

    Qui inverti la stringa e taglia la stringa dal 2 ° carattere e inverti di nuovo.

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

    Qui cercherai un'espressione regolare .$che significa che qualsiasi carattere è seguito da un ultimo carattere e lo sostituisci con null //(tra le due barre)


7

In awk, potresti farlo

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

2

un altro approccio:

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

Trasformalo in una funzione:

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

Quindi chiamalo così:

remove_last '%' df -h

mapfile è una funzione bash4.

Il trucco qui è che devi fornire un personaggio da rimuovere; se vuoi che sia qualunque sia l'ultimo personaggio, allora devi passare '?'o ''. preventivi richiesti.


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

1

Prova con questo:

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

L'uso normale è: (cioè)

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

La risposta dovrebbe essere: X987654321X


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

Questa risposta potrebbe essere più utile agli altri oltre a OP se potessi fornire un po 'di spiegazioni su come funziona e forse perché questo potrebbe essere migliore delle alternative
Fox

Benvenuto in Unix Stackexchange! Puoi fare il tour per avere un'idea di come funziona questo sito. Quando dai una risposta, è preferibile dare una spiegazione del perché la tua risposta è quella che il lettore vuole. Ciò significa che è meglio dare una spiegazione di come funziona. Se guardi sopra, vedrai che tutte le risposte molto votate spiegano il codice.
Stephen Rauch,

Eseguito l'upgrade per cut -d '%' -f1cui è la risposta corretta per ottenere tutto in linea fino al primo '%'.
Titou,

Inoltre, credo che solo le risposte dannose / sbagliate dovrebbero mai essere ridimensionate al di sotto di 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

Opzionale : per eliminare la 1a e l'ultima riga utilizzare il sed -ie '1d;$d'nome file


0
echo "123" | perl -ple 'chop'
12
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.