2016-10-24 1 views
0

J'essaie d'obtenir la valeur des lignes avec le même nom dans un fichier smap en utilisant bash, mais je ne sais pas comment le faire. Par exemple, j'ai besoin d'obtenir la valeur de chaque ligne commençant par "Size:" int afin d'obtenir la taille totale. Quelle est la meilleure façon de le faire?Lecture/proc/pid/smaps

Exemple de fichier SMAP:

enter image description here

+0

Veuillez ne pas publier d'images. Poster un message – hek2mgl

Répondre

1

Je suppose que la taille est seulement donné en ko

#!/usr/env/bin bash 
sum=0 
grep "^Size:" /proc/pid/smaps | (while read line 
do 
size=$(echo "$line" | tr -s '\t' ' ' | cut -d' ' -f2) 
sum=$((sum + size)) 
done 
echo $sum) | xargs -I{} echo "total size: {} kB" 

1- Obtenez toutes les lignes de taille

grep "^Size:" /proc/pid/smaps 

2 - Re trieve la partie intéressante de la ligne correspondante en cours et perfom choses sur elle (dans notre cas résumer)

while read line 
do 
size=$(echo "$line" | tr -s '\t' ' ' | cut -d' ' -f2) 
sum=$((sum + size)) 
done 

enfermer ensuite dans les parenthèses cinque un echo pour retirer la valeur de la déclaration while

| (while read line 
do 
size=$(echo "$line" | tr -s '\t' ' ' | cut -d' ' -f2) 
sum=$((sum + size)) 
done 
echo $sum) | 

3- maintenant, la taille totale est disponible à partir de la conduite et vous pouvez l'utiliser

xargs -I{} echo "total size: {} kB" 
0
#!/bin/bash 
SUM=0 
while read -r line 
do 
    f=($line) 
    if [ "${f[0]}" == "Size:" ] 
    then 
     size=$(numfmt --from=iec --suffix=B "${f[1]}${f[2]^^}") 
     SUM=$(($SUM + ${size: : -1})) 
    fi 
done < /proc/$$/smaps 
echo "I have $(numfmt --to=iec $SUM) in /proc/$$/smaps!" 

Le script ci-dessus boucle /proc/$$/smaps en séparant chaque ligne par des espaces puis utilise numfmt pour convertir n'importe quelle valeur de Size en octets.