web-dev-qa-db-fra.com

Supprimer le dernier caractère de la ligne

Je souhaite supprimer le dernier caractère d'une ligne:

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

Résultat attendu:

Use
22
1
1
59
51
63
5
60
Özzesh
sed 's/.$//'

Pour supprimer le dernier caractère.

Mais dans ce cas précis, vous pouvez également faire:

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

Avec l'expression arithmétique ($5+0) nous forçons awk à interpréter le 5ème champ comme un nombre, et tout ce qui se trouve après le nombre sera ignoré.

Notez que GNU df (votre -h est déjà une GNU, bien qu'elle ne soit pas nécessaire ici) peut également être invitée à afficher uniquement le pourcentage d'utilisation du disque:

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

(la queue saute les en-têtes et tr supprime tout sauf les chiffres et les délimiteurs de ligne).

Sous Linux, voir aussi:

findmnt -no USE%
94
Stéphane Chazelas

Avec sed, c'est assez simple:

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

La syntaxe est s(ubstitute)/search/replacestring/. Le . Indique n'importe quel caractère et le $ La fin de la ligne. .$ Supprimera donc uniquement le dernier caractère.

Dans ce cas, votre commande complète devrait ressembler à:

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

J'ai deux solutions:

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

    Ici, vous inversez la chaîne et coupez la chaîne du 2e caractère et inversez à nouveau.

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

    Ici, vous rechercherez l'expression régulière .$ ce qui signifie tout caractère suivi d'un dernier caractère et remplacez-le par null // (entre les deux barres obliques)

16
Guru

En awk, vous pourriez faire

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

une autre approche:

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

Transformez-le en une fonction:

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

Ensuite, appelez-le comme ceci:

remove_last '%' df -h

mapfile est une fonctionnalité bash4.

Le hic ici est que vous devez fournir un personnage à supprimer; si vous voulez qu'il soit juste quel que soit le dernier caractère alors vous devez passer '?' ou ''. devis requis.

2
Josh McGee
$ df -h | awk '{print $5}' | cut -d '%' -f1 
1
ashok
echo "123" | Perl -ple 'chop'
12
1
bsb

Essayez avec ceci:

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

L'utilisation normale est: (ie)

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

La réponse doit être: X987654321X

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

Facultatif: pour supprimer la 1ère et dernière ligne, utilisez sed -ie '1d;$d' nom de fichier

0
sudhir tataraju