巧用shell脚本统计磁盘使用情况

简介: 在系统环境中存在大量的文件时,统计磁盘空间的工作变得尤为重要。 首先是传统的文件统计,通常使用-s选项,但是只能得到一个概要的信息,如果想定位哪些文件消耗的空间较大还是比较麻烦的。
在系统环境中存在大量的文件时,统计磁盘空间的工作变得尤为重要。
首先是传统的文件统计,通常使用-s选项,但是只能得到一个概要的信息,如果想定位哪些文件消耗的空间较大还是比较麻烦的。
[ora11g@rac1 new_test]$ du -s .
1296    .
[ora11g@rac1 new_test]$ du -sh .
1.3M    .
[ora11g@rac1 new_test]$ du -s .
1296    .
这个时候,勉强可以使用-s ./*的形式得到所有的文件夹的大小情况。但是还是不够直观。
[ora11g@rac1 new_test]$ du -s ./*
80      ./append
32      ./append_fix
60      ./COL_LIST
24      ./compare
56      ./DESC_LIST
4       ./DUMP
80      ./DUMP_LIST
44      ./extract
48      ./full_append
92      ./init
48      ./loading
8       ./monitor
20      ./net_extract
108     ./parallel
88      ./parfile
248     ./partition_append
76      ./partition_extract
128     ./prepare
40      ./split_loading
8       ./tab_parall.lst

这个时候可以考虑使用-S选项,得到的列表会统计文件夹及其目录的大小。定位问题相对比较轻松。
[ora11g@rac1 new_test]$ du -S .
80      ./append
20      ./net_extract
80      ./DUMP_LIST
8       ./append_fix/ERRTAB_LIST
24      ./append_fix
48      ./loading
8       ./monitor
44      ./extract
248     ./partition_append
48      ./full_append
24      ./init/sqls/target
20      ./init/sqls/source
8       ./init/sqls
40      ./init
56      ./DESC_LIST
108     ./parallel
4       ./compare/logs
4       ./compare/sqls
16      ./compare
4       ./DUMP
28      ./prepare/post
28      ./prepare/pre
72      ./prepare
60      ./COL_LIST
76      ./partition_extract
88      ./parfile
4       ./split_loading/sqls
36      ./split_loading
12      .

但是如果文件目录下有很多的文件和文件夹,查出来的结果就会比较凌乱。我们可以得到最占用空间的10个目录,这样定位问题就比较有针对性。
下面的命令可以得到前10位的占用空间较大的目录。通过sed直接过滤了前10位之后的信息。
[ora11g@rac1 test]$ du -S .|sort -rn|sed '{11,$D;}'
130668  .
552     ./ext_datapump/split_loading
500     ./parallel
460     ./ext_datapump_14_jul/DUMP
444     ./ext_datapump/split_loading/log_bak
324     ./ext_datapump/DUMP_LIST
316     ./ext_datapump/ext_datapump/DUMP_LIST
316     ./ext_datapump_14_jul/ext_datapump/DUMP_LIST
304     ./ext_datapump/DESC_LIST
300     ./ext_datapump/COL_LIST



这样看起来还可以,但是如果输出的结果中显示空间的占用情况排名就好了。比如 
1   x xxx
2   xxxxxx
我们可以输出行号,然后换行
先输出行号
[ora11g@rac1 test]$ du -S .|sort -rn|sed '{11,$D;=}'
1
130668  .
2
552     ./ext_datapump/split_loading
3
500     ./parallel
4
460     ./ext_datapump_14_jul/DUMP
5
444     ./ext_datapump/split_loading/log_bak
6
324     ./ext_datapump/DUMP_LIST
7
316     ./ext_datapump/ext_datapump/DUMP_LIST
8
316     ./ext_datapump_14_jul/ext_datapump/DUMP_LIST
9
304     ./ext_datapump/DESC_LIST
10
300     ./ext_datapump/COL_LIST
[ora11g@rac1 test]$ 

然后换行
[ora11g@rac1 test]$ du -S .|sort -rn|sed '{11,$D;=}'|sed 'N;s/\n/ /'
1 130668        .
2 552   ./ext_datapump/split_loading
3 500   ./parallel
4 460   ./ext_datapump_14_jul/DUMP
5 444   ./ext_datapump/split_loading/log_bak
6 324   ./ext_datapump/DUMP_LIST
7 316   ./ext_datapump/ext_datapump/DUMP_LIST
8 316   ./ext_datapump_14_jul/ext_datapump/DUMP_LIST
9 304   ./ext_datapump/DESC_LIST
10 300  ./ext_datapump/COL_LIST

这个时候大部分工作都完成了,剩下的就是结果集的格式化了。可以简单格式化一下。
[ora11g@rac1 test]$ du -S .|sort -rn|sed '{11,$D;=}'|sed 'N;s/\n/ /'|awk '{print $1 ":" "\t" $2 "\t" $3 "\n"}'
1:      130668  .

2:      552     ./ext_datapump/split_loading

3:      500     ./parallel

4:      460     ./ext_datapump_14_jul/DUMP

5:      444     ./ext_datapump/split_loading/log_bak

6:      324     ./ext_datapump/DUMP_LIST

7:      316     ./ext_datapump/ext_datapump/DUMP_LIST

8:      316     ./ext_datapump_14_jul/ext_datapump/DUMP_LIST

9:      304     ./ext_datapump/DESC_LIST

10:     300     ./ext_datapump/COL_LIST

最后可以把错误日志做一个简单的处理。
[ora11g@rac1 test]$ du -S . 2>/dev/null|sort -rn|sed '{11,$D;=}'|sed 'N;s/\n/ /'|awk '{print $1 ":" "\t" $2 "\t" $3 "\n"}'
1:      130668  .

2:      552     ./ext_datapump/split_loading

3:      500     ./parallel

4:      460     ./ext_datapump_14_jul/DUMP

5:      444     ./ext_datapump/split_loading/log_bak

6:      324     ./ext_datapump/DUMP_LIST

7:      316     ./ext_datapump/ext_datapump/DUMP_LIST

8:      316     ./ext_datapump_14_jul/ext_datapump/DUMP_LIST

9:      304     ./ext_datapump/DESC_LIST

10:     300     ./ext_datapump/COL_LIST
在这个基础上可以发挥更多的功能,可以使用各种监控指标进行更进一步的扩展。
目录
相关文章
|
5天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3天前
|
监控 Unix Shell
shell脚本编程学习
shell脚本编程
22 12
|
6天前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
9天前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
26 2
|
1月前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
43 17
|
1月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
36 12
|
28天前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
36 8
|
29天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
2月前
|
Ubuntu Linux Shell
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
|
2月前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
30 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志