Board logo

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

作者: hello163commail    时间: 2014-3-20 15:48     标题: 请问按一定格式输出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"},  
  ]
}
作者: DAIC    时间: 2014-3-20 16:23

  1. #!/bin/bash
  2. echo {
  3. echo '  "data":['
  4. echo "  "
  5. df -mP | awk 'NR>1{print "  { \"{#FSNAME}\":\"\\"$6"\", \"{#FSVALUE}\":\""$2"\"},"}'
  6. echo "  ]"
  7. echo }
复制代码

作者: hello163commail    时间: 2014-3-21 09:56

回复 2# DAIC


如果我再想遇到 /,前面就加个\,又该怎么做呢?
作者: DAIC    时间: 2014-3-21 11:18

回复 3# hello163commail


{
  "data":[

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

是这样吗?
作者: hello163commail    时间: 2014-3-21 12:16

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

回复 4# DAIC


    是的,而且文件系统信息的最后一行没有逗号,像下面这样
{
  "data":[
  
  { "{#FSNAME}":"\/", "{#FSVALUE}":"29529"},
  { "{#FSNAME}":"\/dev\/shm", "{#FSVALUE}":"499"}  #这里没有逗号了
  ]
}
作者: hello163commail    时间: 2014-3-21 12:26

本帖最后由 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,就可以输出逗号。
作者: DAIC    时间: 2014-3-21 17:04

  1. #!/bin/bash
  2. echo {
  3. echo '  "data":['
  4. echo "  "
  5. df -mP | awk 'NR>1{gsub(/\//,"\\/",$6);print "  { \"{#FSNAME}\":\""$6"\", \"{#FSVALUE}\":\""$2"\"},"}' | sed '$s/,$//'
  6. echo "  ]"
  7. echo }
复制代码

作者: hello163commail    时间: 2014-3-27 16:34

回复 7# DAIC


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

回复 8# hello163commail


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

你把这些代码自己写好,我可以帮你写条件判断。
如果你一点都不会的话,我们再继续讨论。
作者: hello163commail    时间: 2014-3-27 19:34

本帖最后由 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 ……,有没更简捷的方法。
  1. #!/bin/bash
  2. case "$2" in
  3. total)
  4. df -m|grep "$1"|awk '{print $2}'
  5. ;;
  6. used)
  7. df -m|grep "$1"|awk '{print $3}'
  8. ;;
  9. pused)
  10. df -m|grep "$1"|awk '{print $5}'
  11. ;;
  12. free)
  13. df -m|grep "$1"|awk '{print $4}'
  14. ;;
  15. pfree)
  16. df -m|grep "$1"|awk '{print $4/$2}'
  17. ;;
  18. esac
复制代码

作者: DAIC    时间: 2014-3-27 19:35

回复 10# hello163commail


    你这不是自己写完了么,还有问题不?
作者: hello163commail    时间: 2014-3-27 19:41

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

回复 11# DAIC

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

回复 12# hello163commail


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




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2