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

Gourou
la source
7

Dans awk, vous pouvez faire l’un des

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

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

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

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