有个访客发邮件给我说,作为linux的初学者,他很难理解Linux命令中“|”的用法。也难怪,脱 胎于DOS命令的Windows命令(软件)大而全,且很少有命令可以组合使用(for命令是后加的)。*nix将命令看作“工具箱中的工具”,各个命令 的组合才显示出其灵活和强大。习惯于windows思维的人很难一时领会。话扯远一点,也就是“工具箱”的逻辑才造就出LAMP的王牌组合。
提起重定向,不得不首先从“>”讲起。看得出,这是个箭头其含义是“将命令结果保存在箭头所指的文件”,windows也有种操作方式。与之 对应的还有一个“>>”,“将命令结果追加在箭头所指的文件的末尾(其实是在原文件EOF之前先追加\n,再追加命令结果)”。
将当前目录下所有文件列表保存为a.txt
ls > a.txt
在a.txt末尾追加“hello world!”
echo "hello world!" >> a.txt
列出当前目录下所有文件并分页显示
ls | more
类似于DOS操作的dir /p ,但如果将"more"改为"less"可实现上下翻页,更加灵活。该命令等价于:
ls > a.txt
more a.txt
列出当前目录下所有文件名中包含"a"的文件
ls | grep a
这条命令是等同于ls *a* 的,但为了解释清楚特地舍近求远。
该命令可拆分为两条命令来执行
ls > tmp.txt
grep a tmp.txt
具体grep的含义在这里不作解释,具体man grep吧
列出当前目录下所有文件名中包含"a"且包含b的文件
传统的DOS命令无法执行了
ls | grep a | grep b
列出当前目录下所有文件名中包含a且包含b的文件的个数
ls | grep a | grep b | wc -l
删除系统中所有*.tmp文件——windows系统清理工具的工作
find / -name "*.tmp" | xargs -d "\n" rm -f
这里要利用到xargs命令,这个命令在不少linux下是没有-d参数的,本例是基于FC5的。由于本文并非介绍具体命令的用法,对于该命令感兴趣的请查看man xargs
前些天刚巧有个“比较懒”的朋友由于PHP session目录中文件太多而无法用rm直接删除(具体报错不记得了),处理方法为:
ls | xargs -d "\n" rm -f
类似的还有,用rpm删除所有xorg的软件包(仅做实例,由于rpm包之间相互依赖,根本无法用一条命令删除)
rpm -qa | grep xorg | xargs -d "\n" rpm -e
至于"|"的用法,个人觉得可以这样理解:“将命令结果保存为一个文件(管道),并将文件名列在下一条‘命令’之后,执行‘下一条命令’”。感觉好拗口。
最后说个比较极端的用法,我曾经出过的一道linux系统管理员的面试题目:
已知当前目录下共计n个以apache_log开头的,并以gzip压缩过的apache日志文件,用一条命令将访问者IP的Top10列出来。
zcat apache_log* | awk '{print $1}' | sort | uniq -i | sort -gr | head -n 10 | awk '{print $2}'
怎样?几乎胜任了一个日志分析软件的工作,这下感觉到*nix组合命令的威力了吧?

没有评论:
发表评论