一段文件相关的shell脚本解读

简介: CODE: #!/sbin/ksh dir=${1:-.} (cd $dir;pwd) find $dir -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f | sed ...
CODE:
#!/sbin/ksh
dir=${1:-.}
(cd $dir;pwd)
find $dir -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f |
sed -e "s,[^ /]*/\([^ /]*\) ==,\|--\1," -e"s,[^ /]*/,| ,g"
#The End

感觉有些难度,不知哪位大侠能够给在下解释一下!
作者: feeling    时间: 2002-3-21 20:59     标题: Shell的魅力

第五行是紧跟在第四行之后的,由于太长被强制换行了。
作者: michaelds    时间: 2002-3-21 21:55     标题: Shell的魅力

[这个贴子最后由michaelds在 2002/03/21 10:06pm 编辑]

这个程序包含的知识点比较多,如果不是在这些点方面均有了解的话,理解起来会比较困难。但是仔细分析搞懂,还是很有收获的。因此在这里细细解读一下:
程序目的:
对指定的目录,显示该目录及其下所有子目录所占用的空间。显示方式上,要求以类windows树状结构的方式表现目录和子目录的关系,显示空间大小用(?kb)的样式说明。
程序代码:
(1)#!/sbin/ksh
(2)dir=${1:-.}
(3)(cd $dir;pwd)
(4)find $dir -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f | sed -e "s,[^ /]*/\([^ /]*\) ==,\|--\1," -e"s,[^ /]*/,| ,g"

(1)表明使用的shell解释器为ksh
(2)对变量dir赋值,如果执行该程序时指定了第一参数$1,那么dir的值即为$1(即指定目录),如果没有指定参数,那么dir的值为"."(即当前目录)。这种变量设置的模式还有=value、+value、:?value、?value、:=value、:-value,各有其功能。
(3)为了首先显示一下处理的路径所在的主目录,需要进至该目录,然后用pwd命令显示出来。用()括起来,表示这两句作为一组命令一起执行,而且有个重要的好处就是执行完后不会影响程序的当前路径,可以理解是()使其内部命令在一子shell中运行,一旦执行完毕便恢复原shell的环境。
(4)这句是关键。
首先find $dir -type d -print表明要把$dir指定的目录下所有的子目录都找到并显示出来。-type d说明找的是目录而不是文件。
然后,使用du命令显示每一目录所占空间由于du命令显示的单位是512字节块,因此要将得到的值除以2,得到kb值。根据du的输出结果,第二列是目录,第一列是值,因此使用awk分别处理,$1/2的表达式要用引号引起是要让awk正确识别表达式。
sort -f是要把输出的结果排序,按字母顺序排序,便于使用的人察看。使用-f可以让sh排序时对大小写不敏感。
sed一句是关键中的关键,-e的写法可以使sed连续执行多套命令,此处有两个-e。来看命令集:s打头,表明了是一个替换任务,跟我们熟悉的不同,我们平时用s/aa/bb/这样的形式较多,但对于sed来说,分隔符是可以自行任意指定的,这里sed将跟在s命令后的","作为了分隔符。于是就有了s,...,...,的样子。
我们知道格式是“s/源串/目标串/”,那么第一组命令,源串是说什么呢?[]的用法在sed中表示:取[]字符组中的一个字符,而[]中的第一位若是"^",则表示不取后面的任何一个字符。那么[^ /]*/就表示匹配这样的格式:"由不是空格或/的一个或多个字符组成的串,后面紧跟一个/",接下来有\(......\)的格式,这种格式用在源串中,表示用这种符号括注的部分要sed记住,而且sed会给这个部分自动起个名字叫\1,如果在源串中还有这样的标记,就依次命名为\2,\3......。这\1要sed记住什么呢?是"[^ /]*",这还是说"由不是空格或/的一个或多个字符组成的串"。\1之后还有" =="也是源串中要求匹配的。再来看目标串,就是要替换成的串,是"\|--\1",作者认为"|"是特殊字符,所以前跟\号(其实不必)。"--"是普通符号了,\1就是我们刚才在源串中要求标记的部分,换到这里来。
第二组命令简单一些。源串:"[^ /]*/",仍然是"由不是空格或/的一个或多个字符组成的串,后面紧跟一个/",目标串是"| ",最后一个g表明全行替换,就是说如果在一行中有多处匹配源串,都要替换成目标串。
再从该程序应用的角度看这一句的功能:
作者是要把这样的显示结果
. == (904724kb)
./bak == (1kb)
./billfile == (1kb)
./bin == (11646kb)
./bin/images == (16kb)
....................
替换成这样的结果
. == (904724kb)
|--bak (1kb)
|--billfile (1kb)
|--bin (11646kb)
| |--images (16kb)
....................
对于"aaa/xxxx/yyyy =="分解这一要求,实际是两步,先把"xxxx/yyyy =="替换为"|--yyyy",然后将aaa变成"| "(如没有aaa则无行为),在aaa中含有几个/,就换成几个"| "。这里的sed命令恰好完成了这一功能。

程序改进:
(1)实际该程序没有使用ksh的任何特殊功能,改为sh仍可正常运行,兼容性会更好。
(2)先find再du是没有必要的。因为du本身就能寻找子目录,且自动显示每个子目录的大小。另外,如果对指定的目录无读权限的话,find就会报出错,但直接用du则没事。
(3)"|"在sed中不是特殊字符不必再用"\"转义了。
最后我的建议结果如下:
#!/bin/sh
dir=${1:-.}
(cd $dir;pwd)
du $dir| awk '{print $2, "== ("$1/2"kb)"}' |sort -f|sed -e "s,[^ /]*/\([^ /]*\) ==,|--\1," -e "s,[^ /]*/,| ,g"
作者: valentine    时间: 2002-3-21 23:27     标题: Shell的魅力

michaelds 解释的太好了。

我想我们大家在注意shell的时候,应该注意shell中处处用得到的正则表达式。
^,$,.,*,[] 应该很清楚,这样在sed ,awk,case,vi ...里都能顺畅自如.
目录
相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
419 9
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
310 2
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
269 60
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
Shell
Shell 文件包含
10月更文挑战第5天
141 4
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
556 0
|
6月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
182 17
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
197 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
400 3