返回列表 发帖

[问题求助] 请问按一定格式输出linux文件系统信息的脚本怎么写啊

比方说:df -m后是这样的信息
Filesystem     1M-blocks  Used     Available Use% Mounted on
/dev/sda1          29529   3169     24860     12%     /
tmpfs                  499      1           499         1%      /dev/shm

但是我想要这样输出:
{
  "data":[
  
  { "{#FSNAME}":"\/", "{#FSVALUE}":"29529"},
  { "{#FSNAME}":"\/dev/shm", "{#FSVALUE}":"499"},  
  ]
}

#!/bin/bash
echo {
echo '  "data":['
echo "  "
df -mP | awk 'NR>1{print "  { \"{#FSNAME}\":\"\\"$6"\", \"{#FSVALUE}\":\""$2"\"},"}'
echo "  ]"
echo }COPY
1

评分人数

TOP

回复 2# DAIC


如果我再想遇到 /,前面就加个\,又该怎么做呢?

TOP

回复 3# hello163commail


{
  "data":[

  { "{#FSNAME}":"\/", "{#FSVALUE}":"29529"},
  { "{#FSNAME}":"\/dev\/shm", "{#FSVALUE}":"499"},
  ]
}

是这样吗?

TOP

本帖最后由 hello163commail 于 2014-3-21 12:18 编辑

回复 4# DAIC


    是的,而且文件系统信息的最后一行没有逗号,像下面这样
{
  "data":[
  
  { "{#FSNAME}":"\/", "{#FSVALUE}":"29529"},
  { "{#FSNAME}":"\/dev\/shm", "{#FSVALUE}":"499"}  #这里没有逗号了
  ]
}

TOP

本帖最后由 hello163commail 于 2014-3-21 12:51 编辑

回复 4# DAIC

我写了个:
#!/bin/bash
echo {
echo '  "data":['
echo "  "
line=$(df -m|wc -l)
df -mP | awk 'NR>1{printf "  { \"{#FSNAME}\":\"\\"$6"\", \"{#FSVALUE}\":\""$2"\"}"}{if(NR>1&&NR<$line){print ","}else{print ""}}'
echo "  ]"
echo }

但是不知道怎么弄遇到/就在前面加个\

而且我用$line的时候,第一行"29529"后面也无法输出逗号,直接用数字4,就可以输出逗号。

TOP

#!/bin/bash
echo {
echo '  "data":['
echo "  "
df -mP | awk 'NR>1{gsub(/\//,"\\/",$6);print "  { \"{#FSNAME}\":\""$6"\", \"{#FSVALUE}\":\""$2"\"},"}' | sed '$s/,$//'
echo "  ]"
echo }COPY
1

评分人数

TOP

回复 7# DAIC


    您好,还想请教个问题,比如说:
    想写一个shell脚本,接受从外面来的两个参数,第一个参数是变量$FSNAME,第二个参数是字符串total/used/free等等。
    如果外面的参数是$FSNAME,total,那就输出$FSNAME该变量代表的文件系统的总容量,
    如果外面的参数是$FSNAME,free,那就输出$FSNAME该变量代表的文件系统的空闲空间。
    如果外面的参数是$FSNAME,pfree,那就输出$FSNAME该变量代表的文件系统的空闲空间率。
    如果外面的参数是$FSNAME,used,那就输出$FSNAME该变量代表的文件系统的使用闲空间。
    如果外面的参数是$FSNAME,pused,那就输出$FSNAME该变量代表的文件系统的使用闲空间率。
   
    这样话,脚本该怎么写呢?

TOP

回复 8# hello163commail


输出$FSNAME该变量代表的文件系统的总容量,
输出$FSNAME该变量代表的文件系统的空闲空间。
输出$FSNAME该变量代表的文件系统的空闲空间率。
输出$FSNAME该变量代表的文件系统的使用闲空间。
输出$FSNAME该变量代表的文件系统的使用闲空间率。

你把这些代码自己写好,我可以帮你写条件判断。
如果你一点都不会的话,我们再继续讨论。

TOP

本帖最后由 hello163commail 于 2014-3-27 19:40 编辑

回复 9# DAIC


    假设我的文件系统是这样的:
    Filesystem     1M-blocks  Used Available Use%   Mounted on
    /dev/sda1         147647  7824    132323   6%   /
    tmpfs               1981     1          1981       1%   /dev/shm
   /dev/sda2          50002   218       47244   1%   /home

   我写的脚本是下面这样的,主要有几点疑问:
1)grep "$1",这个要加什么符号才是完全匹配(我记得是不是/>之类的符号),比如如果$1是文件系统 /,的话,那会不会匹配到/dev/shm、/home
2)$1,$2是位置变量吗?和awk的$2会不会有冲突?
3)每个输出都有df -m|grep ……,有没更简捷的方法。
#!/bin/bash
case "$2" in
total)
df -m|grep "$1"|awk '{print $2}'
;;
used)
df -m|grep "$1"|awk '{print $3}'
;;
pused)
df -m|grep "$1"|awk '{print $5}'
;;
free)
df -m|grep "$1"|awk '{print $4}'
;;
pfree)
df -m|grep "$1"|awk '{print $4/$2}'
;;
esacCOPY

TOP

回复 10# hello163commail


    你这不是自己写完了么,还有问题不?

TOP

本帖最后由 hello163commail 于 2014-3-27 19:58 编辑

回复 11# DAIC

1)grep "$1",这个要加什么符号才是完全匹配(我记得是不是/>之类的符号),比如如果$1是文件系统 /,的话,那会不会匹配到/dev/shm、/home
2)$1,$2是位置变量吧。和awk的$2会不会有冲突?
3)每个输出都有df -m|grep ……,有没更简捷的方法。

TOP

回复 12# hello163commail


1)df -m|grep "$1$"|awk '{print $2}'
2)不会有冲突
3)df不会多次执行,改不改对效率没什么影响

TOP

返回列表