Je suis actuellement l'utilisation de la mémoire de ma machine en utilisant la boucle suivante dans bash:
date time total used free shared buffers cached 2020-11-13 22:55:56 8333 627 5705 0 1638 685 2020-11-13 22:55:57 8333 677 5656 0 1638 685 2020-11-13 22:55:58 8333 725 5607 0 1638 685 2020-11-13 22:55:59 8333 773 5560 0 1638 685
Ce qui me donne un fichier txt avec quelque chose comme ça (valeurs modifiées):
echo " date time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" | tee -a log20201113.txt
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" | tee -a log20201113.txt
sleep 1
done
J'essaye de sortir cela dans un fichier csv à la place. Mettre une extension csv ne semble pas fonctionner car elle n'inclut pas de séparateurs. Comment pourrais-je inclure des séparateurs et les mettre dans un fichier csv à la place?
3 Réponses :
essayez la tuyauterie dans sed:
2020-11-14,17:42:42,7748,2190,729,601,4828,4490 2020-11-14,17:42:43,7748,2189,733,598,4825,4494
le sed remplacera les espaces par des virgules, alors vous avez csv.
à partir du fichier texte directement, vous pouvez faire:
sed -i "s/\s\+/,/g" yourfile.txt , il remplacera tout espacé par une virgule.
alors vous obtenez
echo " date time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" | tee -a log20201113.txt
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" | tee -a log20201113.txt
sleep 1
done | sed "s/\s\+/,/g"
piping to awk '{$1=$1}1' OFS="," avant tee devrait être suffisant pour convertir en csv . par exemple:
echo " date time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" | tee /dev/tty | awk '{$1=$1}1' OFS="," >> log20201113.csv
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" | tee /dev/tty | awk '{$1=$1}1' OFS="," >> log20201113.csv
sleep 1
done
produit:
$ head -n 5 log20201113.csv date,time,total,used,free,shared,buff/cache,available 2020-11-14,17:30:04,3638,1663,765,177,1208,1561 2020-11-14,17:30:05,3638,1663,765,177,1208,1561 2020-11-14,17:30:06,3638,1662,766,177,1208,1562 2020-11-14,17:30:07,3638,1662,767,177,1208,1562
quand awk assigne à un champ ( $1=$1 ) il le fera
fait reconstruire $ 0 en concaténant les $ i séparés par OFS
où $0 est la ligne d'entrée, $i sont les champs et OFS est , dans notre cas. le 1 final est juste un motif "toujours correspondre" qui est toujours exécuté avec l'action par défaut ( print ).
mais cela sera également imprimé sur stdout au format csv . si cela pose un problème et que vous souhaitez conserver une sortie joliment formatée sur le terminal et csv dans le fichier, vous pouvez utiliser cette "astuce" :
echo " date time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" | awk '{$1=$1}1' OFS="," | tee -a log20201113.csv
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" | awk '{$1=$1}1' OFS="," | tee -a log20201113.csv
sleep 1
done
En voici un dans GNU awk, qui lit les informations de mémoire dans /proc/meminfo :
date time,total,used,free,shared,buffers,cached 2020-11-1419:12:42,16135228,6586304,6713024,0,213652,362516 2020-11-1419:12:43,16135228,6586304,6713024,0,213652,362516 ...
Production:
$ gawk '
@load "time" # sleep
BEGIN {
OFS="," # field separator
printf "%s%s%s%s%s%s%s", # header
"date time" OFS,
"total" OFS,
"used" OFS,
"free" OFS,
"shared" OFS,
"buffers" OFS,
"cached" ORS
while(1) { # keep looping
while((getline < "/proc/meminfo")>0)
a[$1]=$2
printf "%s%s%s%s%s%s%s",
strftime("%F%T") OFS,
a["MemTotal:"] OFS,
a["MemTotal:"]-a["MemFree:"]-a["Buffers:"]-a["Cached:"]-a["SReclaimable"] OFS,
a["MemFree:"] OFS,
a["ShmemHugePages:"] OFS,
a["Buffers:"] OFS,
a["Buffers:"]+a["SReclaimable:"] ORS
sleep(1)
}
}'