赞
踩
测试过程中,将操作系统的结果差异性考虑其中。
SoftwareTeacher看了《Unix 传奇》一书,想起很久以前读 Unix 文件系统设计思想的时候,里面提到Unix 的很多文件大小在 4K 以下。他提了一个问题
“怎么能用Unix 的awk, sed 和其它 shell 命令统计出你当前 Unix/Linux 系统上 所有文件大小的分布情况? (小于1K, 1K - 4K, 4K - 1M, 1M - 10M, 10M - 1G, 1G 以上)”
下面是基本实现思路:
- 使用命令列出目录下的所有文件信息
- 使用命令过滤出文件名和文件大小的列
- 使用命令统计不同文件大小的个数并计算百分比打印
- 使用管道把上述1/2/3组合起来
下面意义对这四步进行分解
ls -Rla
- lkmao@ubuntu:~/01$ ls -Rla
- .:
- 总用量 40
- drwxrwxr-x 3 lkmao lkmao 4096 11月 23 13:35 .
- drwxrwxr-x 57 lkmao lkmao 4096 11月 23 13:34 ..
- -rwxrwxr-x 1 lkmao lkmao 9208 11月 23 13:18 a.out
- -rw-rw-r-- 1 lkmao lkmao 732 11月 23 10:00 file.c
- -rw-rw-r-- 1 lkmao lkmao 662 11月 22 22:28 fork.c
- -rw-rw-r-- 1 lkmao lkmao 4642 11月 23 13:25 hello.txt
- drwxrwxr-x 2 lkmao lkmao 4096 11月 23 13:35 test
-
- ./test:
- 总用量 12
- drwxrwxr-x 2 lkmao lkmao 4096 11月 23 13:35 .
- drwxrwxr-x 3 lkmao lkmao 4096 11月 23 13:35 ..
- -rw-rw-r-- 1 lkmao lkmao 6 11月 23 13:35 1.txt
- lkmao@ubuntu:~/01$
使用awk命令找出第5列和第9列。从结果看,其中有空格存在。
- lkmao@ubuntu:~/01$ ls -Rla | awk '{print $9,$5}'
-
-
- . 4096
- .. 4096
- a.out 9208
- file.c 732
- fork.c 662
- hello.txt 4642
- test 4096
-
-
-
- . 4096
- .. 4096
- 1.txt 6
- lkmao@ubuntu:~/01$
这个依然需要分解为几部
1 将命令ls和awk的执行结果输出到一个文件2.txt中
2 使用sed -i 将该文件中的空格,点号,Tab键删除
3 过滤掉结果中的目录
3 使用cat查看2.txt文件
ls -Rla | awk '{print $9,$5}' > 2.txt
- lkmao@ubuntu:~/01$ cat 2.txt
-
-
- . 4096
- .. 4096
- 2.txt 0
- a.out 9208
- file.c 732
- fork.c 662
- hello.txt 4642
- test 4096
- xixi.sh 258
-
-
-
- . 4096
- .. 4096
- 1.txt 6
- lkmao@ubuntu:~/01$
查看更新后的2.txt
- lkmao@ubuntu:~/01$ cat 2.txt
- . 4096
- .. 4096
- 2.txt 0
- a.out 9208
- file.c 732
- fork.c 662
- hello.txt 4642
- test 4096
- xixi.sh 258
- . 4096
- .. 4096
- 1.txt 6
- lkmao@ubuntu:~/01$
-
从结果中可知,有当前目录"." 和父目录".."这两个也需要删掉
打印2.txt中以点号"."开头的行:
- lkmao@ubuntu:~/01$ sed -n '/^\./p' 2.txt
- . 4096
- .. 4096
- . 4096
- .. 4096
- lkmao@ubuntu:~/01$
-
删除2.txt中以点号"."开头的行:
- lkmao@ubuntu:~/01$ sed -i '/^\./d' 2.txt
- lkmao@ubuntu:~/01$ cat 2.txt
- 2.txt 0
- a.out 9208
- file.c 732
- fork.c 662
- hello.txt 4642
- test 4096
- xixi.sh 258
- 1.txt 6
- lkmao@ubuntu:~/01$
使用wc -l数行数,验证结果是否正确:如下所示,两种验证结果相同。
- lkmao@ubuntu:~/01$ ls -ls | wc -l
- 8
- lkmao@ubuntu:~/01$ cat 2.txt | wc -l
- 8
- lkmao@ubuntu:~/01$
这一步直接使用前三步的成果2.txt文件。虽然有
验证目标:输出小于100字节的文件名字和大小
- cat 2.txt | awk '
- BEGIN{
- size[0]="0-100"
- tatol=0
- }
- ($2 <= 100){a[0]++}
- ($2 <= 100){print "size[i]","name:",$1,"size:",$2}
- {
- total++
- }
- END{
- for(i=0;i<length(a);++i)
- print size[i],"file count:"a[i],"percent:",(a[i]/total)*100,"%"
- }'
-
-
执行结果:使用source执行文件,从执行结果可知,找到了1.txt和2.txt,但是,这不是我们想要的结果。需要重写。
- lkmao@ubuntu:~/01$ source xixi.sh
- size[i] name: 2.txt size: 0
- size[i] name: 1.txt size: 6
- 0-100 file count:2 percent: 25 %
- lkmao@ubuntu:~/01$
-
测试的时候,删除其他的.txt文件。然后中间文件放到了父目录中
- ls -RlA | awk '{print $9,$5}' > ../4.txt
- sed -i '/^[ \t]$/d' ../4.txt
- cat ../4.txt | awk '
- BEGIN{
- size[0]="0-100"
- tatol=0
- }
- ($2 <= 100){a[0]++}
- ($2 <= 100){print "size[i]","name:",$1,"size:",$2}
- {total++}
- END{
- for(i=0;i<length(a);++i)
- print size[i],"file count:"a[i],"percent:",(a[i]/total)*100,"%"
- }'
-
测试结果:
- lkmao@ubuntu:~/01$ source xixi.sh
- size[i] name: 1.txt size: 6
- 0-100 file count:1 percent: 14.2857 %
- lkmao@ubuntu:~/01$
计算小于1024字节和大于1024字节的文件个数和占比:
- #!/bin/bash
- ls -RlA | awk '{print $9,$5}' > ../4.txt
- sed -i '/^[ \t]$/d' ../4.txt
- cat ../4.txt | awk '
- BEGIN{
- size[0]="0-1024"
- size[1]=">1024"
- tatol=0
- }
- ($2 <= 1024){a[0]++}
- ($2 > 1024){a[1]++}
- {total++}
- END{
- for(i=0;i<length(a);++i)
- print size[i],"file count:"a[i],"percent:",(a[i]/total)*100,"%"
- }'
- lkmao@ubuntu:~/01$ source xixi.sh
- 0-1024 file count:4 percent: 57.1429 %
- >1024 file count:3 percent: 42.8571 %
- lkmao@ubuntu:~/01$
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。