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
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%
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/.$//'
J'ai deux solutions:
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.
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)
En awk, vous pourriez faire
awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
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.
$ df -h | awk '{print $5}' | cut -d '%' -f1
echo "123" | Perl -ple 'chop'
12
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
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
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