Supprimer le dernier caractère de la ligne


54

Je veux 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

2
Est-ce toujours un %signe?
Bernhard

Réponses:


83
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 obligeons awkà interpréter le cinquième champ comme un nombre, et tout ce qui suit le nombre sera ignoré.

Notez que GNU df(votre -hest déjà une extension GNU, bien que cela ne soit pas nécessaire ici) peut également indiquer de ne générer que le pourcentage d’utilisation du disque:

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

(tail 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%

9
{print +$5}fonctionnera aussi bien ...
jasonwryan

1
@jasonwryan, malheureusement, il y a beaucoup d' awkimplémentations où cela ne fonctionne pas , où l' +opérateur unaire est simplement ignoré et ne force pas la conversion de chaînes de caractères en chiffres.
Stéphane Chazelas

20

Avec sed, c'est assez facile:

$ 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 $la fin de la ligne. Alors .$va supprimer le dernier caractère seulement.

Dans ce cas, votre commande complète aurait l'air:

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

2
Le tuyau de sedredondance est redondant: cela peut être fait dans awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan Ensuite, j'aime mieux la solution de Stéphane.
Bernhard

15

J'ai deux solutions:

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

    Ici, vous inversez la chaîne et coupez-la à partir du deuxième caractère, puis inversez-la à nouveau.

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

    Ici, vous allez rechercher une expression régulière .$qui signifie tous les caractères suivis d'un dernier caractère et le remplacer par un zéro //(entre les deux barres obliques)


7

Dans awk, vous pouvez faire l’un des

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

2

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}"
}

Alors appelez ça comme ça:

remove_last '%' df -h

mapfile est une fonctionnalité de bash4.

Le problème ici est que vous devez fournir un personnage à supprimer; si vous voulez que ce soit simplement le dernier caractère, alors vous devez passer '?'ou ''. devis requis.



1

Essayez avec ceci:

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

L'usage normal est:

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

La réponse devrait être: X987654321X


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

Cette réponse pourrait être plus utile pour les utilisateurs autres que OP si vous pouviez fournir quelques explications sur son fonctionnement et sur les raisons pour lesquelles cela pourrait être meilleur que les solutions de rechange
Fox

Bienvenue sur Unix Stackexchange! Vous pouvez faire le tour pour avoir une idée du fonctionnement de ce site. Lorsque vous répondez, il est préférable d' expliquer POURQUOI votre réponse est celle que le lecteur souhaite. Cela signifie qu'il est préférable que vous expliquiez comment cela fonctionne. Si vous regardez ci-dessus, vous verrez que toutes les réponses très votées expliquent le code.
Stephen Rauch

Upvoté pour l'utilisation de cut -d '%' -f1ce qui est la bonne réponse pour tout mettre dans la ligne jusqu'au premier '%'.
Titou

De plus, je crois que seules les réponses nuisibles / fausses devraient être réduites au-dessous 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

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.