(1)新形式:以“系列文章”的形式组织全书,读一个系列,就可以深度掌握一个命令。
(2)新表达:文章以“场景化 + 对话”的表达方式,将一个一个知识点娓娓道来。
(3)新角度:内容“不是翻译man手册”,而是更多地来自于七年的运维实战。
本书打破了市面上主流Linux命令书籍的写作风格,创新性地以专题文章和系列文章的形式来组织全书,文风轻松通顺、循序渐进,既适合作为系统学习的案头书,也适合在床头边、地铁上、院落中阅读。本书是这套系列丛书的**本,内容侧重在Shell基础和文件操作方面。为了体现知识的结构化、系统化,本书共分为三个篇章。**篇 Shell基础及工具篇这一部分专注在Shell的通用命令和工具上,主要介绍了Linux工程师*常使用的Shell命令和工具,诸如控制变量作用范围的export命令、查看历史命令的history命令、用于读取用户输入的read命令、便于多窗口操作的tmux工具,等等。第二篇 文件和磁盘篇这一部分专注在文件操作和磁盘查看上,主要介绍了Linux工程师常用的命令,包括文件搜索命令find、文件元信息查看命令file、创建链接文件的命令ln、压缩命令gzip/bzip/zip,等等。第三篇 内容处理篇这一部分专注在文本内容的处理上。作者精心挑选出其中*为常用的内容处理类命令,并详尽介绍了它们的使用方法和技巧,诸如为文本上色的echo命令、文本搜索工具grep、流处理工具sed、文本处理利器awk、排序命令sort、内容加密系列工具,等等。学习完本书后,相信读者朋友们可以轻松而愉快地掌握Linux基础命令、文件及磁盘操作、文本内容处理的知识和技能,并达到一线互联网公司Linux工程师的水平。
1 今天的主角是Shell
老婆问我什么是Shell
面对做会计行业的老婆,我没有信心回答好这个问题。
但是对于阅读本书的读者们来说,相信大家都有计算机知识背景,所以,我还是
很有信心能够解释清楚的。
首先,我们今天所说的Shell,既不是海滩上美丽的贝壳儿,也不是荷兰那家鼎鼎
大名的壳牌公司,而是用在UNIX/Linux 操作系统中的一个叫作Shell 的工具。
其次,众所周知,UNIX/Linux 操作系统的心脏是“内核”,内核主要负责控制硬件、
管理内存和调度任务,而Shell 则是用户与操作系统之间的一座桥梁,用户可以利
用Shell 实现对UNIX/Linux 操作系统及其内核的控制和操作。
最后,Shell 已经发展成为一种解释型编程语言,它不仅包含了大量的命令以实现
与操作系统的对话,还可以实现变量定义、条件判断、循环控制、函数调用等功
能,我们完全可以利用Shell 实现很多复杂的业务逻辑。
如果只用一张示意图来说明什么是Shell 的话,那么下面的这张图再合适不过了。
图1 什么是Shell
1 今天的主角是Shell
Linux 大棚命令百篇(上)——文件和文本篇
3
一睹Shell 的芳容
当我们打开一台安装有UNIX/Linux 操作系统的电脑,输入用户名、密码登录成功
后,系统便会启动一个Shell,它是一个交互式的界面,会等待我们输入指令,就
像这样:
[roc@roclinux ~]$
当我们输入了一条命令之后,Shell 会经过一系列的处理环节,然后执行,并为我
们返回执行结果,就像下面这样:
[roc@roclinux ~]$ uname -a
Linux roclinux 2.6.32-220.4.1.el6.x86_64 #1 SMP Tue Jan 24 02:13:44 GMT
2012 x86_64 x86_64 x86_64 GNU/Linux
大家可以看到,我们输入的命令是“uname -a”,这是一个显示操作系统基本信息
的Shell 命令,像这样的命令,在Shell 中有上千个,比如ls、alias、cat、chgrp、
awk、ulimit、rm,等等。
下面来一起看一下ls 命令的运行效果,如图2 所示。
图2 ls 命令的运行效果
对于Shell 高手来说,交互式Shell 不能完全满足他们的日常需要,他们更善于把
工作和任务通过自动化方式来完成,所以,Shell 脚本应运而生。
当把多个Shell 命令按照一定的逻辑写到一个文件中时,这个文件就可以被叫作
“Shell 脚本文件”。而执行这样的脚本,就可以实现一部分工作的自动化了。
Shell 基础及工具篇
Linux 大棚命令百篇(上)——文件和文本篇
4
世界上第一款Shell
开门见山,世界上第一款Shell,叫作Thompson Shell,于1971 年诞生,1975 年开
始广泛传播。那时很多阅读这本书的同学或许还没有出生吧。
至于为什么叫作Thompson Shell,故事要从1965 年说起。
那一年,贝尔实验室参与到了一个意义重大的项目中,那就是和美国通用电气、
麻省理工学院共同开发一个多用户、多进程的操作系统,产品代号为“Multics”。
一年后,故事的主人公,年仅23 岁的有志青年Thompson 加入贝尔实验室,参与
到了Multics 项目的开发中来。
不幸的是,由于进度缓慢,Multics 项目在1969 年搁浅了。而Thompson 却在这个
项目中积累了大量的操作系统设计经验,并在次年开始了一款全新操作系统的开
发工作,这就是后来赫赫有名的UNIX。1970 年,也因此被称为UNIX 元年!
很快,就在1971 年,UNIX 在实验室范围内发布了它的V1 版本,而Thompson Shell
也随之诞生。1975 年,UNIX 的第六个版本面向公众发布,Thompson Shell 也随之
得到了广泛地传播。
所以Thompson Shell 也被叫作V6 Shell。
那些年,我们一起追的Shell
2011 年,九把刀导演的《那些年,我们一起追的女孩》上映,人们都在回忆自己
曾经追过的女孩。而作为Linux 爱好者,有没有你曾经追过的Shell 呢?
在Linux 的历史长河中,曾经出现过很多种类的Shell,它们之间有的是传承关系,
有的是竞争关系,有的已经不为人所知,有的则家喻户晓。
大浪淘沙过后,最终流传下来的Shell,才是值得我们了解和学习的Shell,如表1
所示。
表1 值得了解和学习的Shell
名 称 全 称 诞生于 流行于
sh Bourne Shell 1977 UNIX
(t)csh C Shell 1978 UNIX
ksh Korn Shell 1983 UNIX
bash Bourne Again Shell 1989 Linux
1 今天的主角是Shell
Linux 大棚命令百篇(上)——文件和文本篇
5
续表
名 称 全 称 诞生于 流行于
zsh Zhong Shao Shell(非官方说法) 1990 Linux
dash Debian Almquist Shell 2002 Linux
其实还有一些偏小众的Shell,大家有兴趣也可以去了解和关注一下,如pdksh、scsh、
psh、mksh,等等。
zsh 是中国人开发的么
我猜一定会有人问,zsh 的全称是Zhong Shao Shell,难道zsh 是中国人开发的么?
非也,非也。zsh 的作者是美国普林斯敦大学的一位学生,他的名字叫作Paul
Falstad。当时有一位名叫Zhong Shao 的助教,他登录Linux Shell 时使用的ID 是
zsh,Paul 非常喜欢这个名字,恰好z 的美式英语的发音和csh 的c 又非常像,于
是就选择了zsh 作为自己编写的Shell 的名字了。
是不是很有趣呢,我们再来讲一个有关csh 的故事。
回到遥远的1978 年,那时的Bill Joy(BSD 操作系统作者、TCP/IP 设计者、vi 作
者、NFS 作者、SUN 公司创立者之一)年仅24 岁,正在加州大学伯克利分校攻读
硕士学位。那一年,他为BSD 开发了一款Shell,起名叫作C Shell,简称csh。之
所以叫C Shell,是因为它的语法和C 语言非常相似。
而在1978 年到1983 年间,又有多位计算机专家在csh 的基础上增加了丰富的功能,
包括拼写校验、历史记录、作业控制、命令行编辑器等。在为这个增强版csh 取名
时,专家们借鉴了历史上一种具有“命令补全”功能的操作系统TENEX 的灵感,
最终将它取名为tcsh,即TENEX csh。
让Shell 飞入寻常百姓家
唐代诗人刘禹锡,在《乌衣巷》中的一句“旧时王谢堂前燕,飞入寻常百姓家”,
流传至今。
而我们希望曾经闻名遐迩的各种Shell,也能“飞入”我们的电脑,让我们能更近
距离地感受它们的设计思想和功能。
以CentOS 发行版为例,如果想查看当前系统都安装了哪些Shell,可以这样:
Shell 基础及工具篇
Linux 大棚命令百篇(上)——文件和文本篇
6
[root@roclinux ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
可以看到,/etc/shells 文件中记录了“当前系统中安装了哪些种类的Shell”:
? /bin/sh:这是Bourne Shell。
? /bin/bash:这是Bourne Again Shell。
? /bin/nologin:这并不是一个Shell,而是指“无法登录”。
那么系统当前使用的到底是什么Shell 呢,我们可以这样来查看:
[root@roclinux ~]# echo $SHELL
/bin/bash
可见,我们当前所使用的是Bourne Again Shell。
如果想尝试一下zsh,应该怎么安装呢?非常简单:
[root@roclinux ~]# yum install zsh
就这样一条语句,就可以让zsh“飞”入你家。
安装完成后,是不是已经迫不及待地想体验一下zsh 了!这也不难:
#首先定位到zsh的绝对路径
[root@roclinux ~]# which zsh
/bin/zsh
#使用-s选项更改登录Shell的类型
[root@roclinux ~]$ chsh -s /bin/zsh
Changing shell for root.
Shell changed.
只需上面两步,我们就已经把root 账户的登录Shell 更改为zsh 了,接下来,只要
退出当前Shell,再以root 账户重新登录进来,就可以享受zsh 啦!
如果想让其他的Shell 也“飞”进你家,如法炮制就好。
可以评价下这些Shell 么
我们不会把每种Shell 的优缺点都列在这里,因为曾经追的很多Shell,现如今已不
是主流,有被新Shell 替代的,也有因功能欠缺被淘汰的。所以,为了节省时间,
这里只简单聊聊bash 和zsh 这两种Shell,原因是,前者主流,后者强大。
1 今天的主角是Shell
Linux 大棚命令百篇(上)——文件和文本篇
7
bash 当属使用最广泛的Shell 了,它融合了csh 和ksh 的长处,规避了两者的短处,
是目前Shell 中的首选。许多Linux 系统、MAC OS 系统都将bash 作为了系统的默
认Shell,所以大家也会看到,非常多的书籍、示例、项目都是面向bash 的,本书
也不例外,毕竟,我们应该将有限的时间用在收益最大的事情上,对不对。
zsh,被有些人称为“终极Shell”。这并不算夸张,zsh 真的算是Shell 中的集大成
者,它融合了tcsh、ksh 和bash 的优秀之处,而且还完全兼容bash,对于用惯了
bash 的同学来说,几乎可以无缝迁移。而zsh 在历史记录提示、命令补全、别名、
语法高亮等方面都有着超出预期的用户体验。
好了,本书的第一篇文章就到这里了。本文中用到的chsh 命令,我们会在下一篇
中进行重点讲解,来,一起进入下一篇!
Shell 基础及工具篇
Linux 大棚命令百篇(上)——文件和文本篇
8
2 用chsh 来改变Shell
我想知道我机器安装了哪些Shell
chsh 命令本身并不复杂,它的功能比较单一,就是负责展示和修改我们系统的登
录Shell。
想修改登录Shell,首先要知道我们的系统安装了哪些Shell。这里有两种方法可以
查看。
方法一:
[roc@roclinux ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
方法二:
[roc@roclinux ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
其实chsh -l 命令本质上也是去查看/etc/shells 文件。
查看当前正在使用的Shell
只使用一个环境变量,就可以查看到当前正在使用的Shell 啦:
[roc@roclinux ~]$ echo $SHELL
/bin/bash
注意:SHELL 一定要大写。可以看到,我们目前使用的Shell 是bash。
2 用chsh 来改变Shell
Linux 大棚命令百篇(上)——文件和文本篇
9
听说zsh 不错,于是我们就通过在命令行执行zsh 命令切换到了zsh 环境。可是,
为什么查看当前Shell 类型仍然是/bin/bash 呢?
[roc@roclinux ~]$ zsh
[roc@roclinux]~% echo $SHELL
/bin/bash
[roc@roclinux]~%
请注意,我们虽然执行了zsh,但是所谓“当前的Shell”是一个大环境的概念,是
针对一个已登录的用户而言的。而我们执行zsh 只是启动了一个zsh 的解释器程序
而已,并没有改变大环境。如果想改变“当前的Shell”,那么还是要求助于chsh
才可以。
将Shell 环境真正切换到zsh
[roc@roclinux ~]$ chsh -s /bin/zsh
Changing shell for roc.
Password:
Shell changed.
使用chsh 命令的-s 选项就可以修改登录的Shell 了。
如果我们这时候满怀欣喜地执行echo $SHELL,就会发现然输出的仍是/bin/bash。
这是因为chsh 改变的是我们登录Shell 的配置,我们必须退出再重新登录Shell,
才可以完全投入到zsh 的怀抱。
真是一波三折,退出并重新登录后,终于看到了我们想要的/bin/zsh 了:
[roc@roclinux]~% echo $SHELL
/bin/zsh
chsh -s 到底修改了哪里
到了揭开迷底的时刻啦!
chsh -s 其实修改的就是/etc/passwd 文件中和我们所登录的用户名相对应的那一行。
现在我们来查看一下:
[roc@roclinux]~% cat /etc/passwd|grep ^roc
roc:x:1001:1001::/home/roc:/bin/zsh
可以发现,输出内容的最后部分已经变成了/bin/zsh 了。重启系统的时候,Linux
就会读取这一命令来启动新的Shell。
好了,我们要恢复正常的工作环境,把Shell 修改回我们熟悉的/bin/bash 了:
Shell 基础及工具篇
Linux 大棚命令百篇(上)——文件和文本篇
10
[roc@roclinux]~% chsh -s /bin/bash
Changing Shell for roc.
Password:
Shell changed.
Shell 基础及工具篇 1
1 今天的主角是Shell 2
2 用chsh 来改变Shell 8
3 export 将环境变量昭告天下 11
4 read,倾听是一种美德 17
5 expr,一款多功能计算器 24
6 tmux 给你带来多窗口的享受 26
7 用alias 起个昵称吧 33
8 history 是历史的镜子 40
9 xargs 绝对的护花使者 46
10 time,你最懂时间 51
11 sleep,睡眠也有学问 57
文件和磁盘篇 60
1 file 命令探寻文件信息 61
2 ln 连接你我他 66
3 find 命令上篇――find 初体验 72
4 find 命令下篇――find 引出的正则知识 83
5 du 最了解磁盘占用 91
6 压缩系列之一――gzip 100
7 压缩系列之二――bzip2 107
8 压缩系列之三――zip 111
9 dd 造出最大的黑洞 114
Linux 大棚命令百篇(上)――文件和文本篇
XII
文本处理篇 119
1 echo 命令上篇――帮你发声,替你歌唱 121
2 echo 命令下篇――让世界充满色彩 126
3 搜索三兄弟grep、egrep 和fgrep 131
4 sed 的流艺术之一――初体验 139
5 sed 的流艺术之二――花样命令 141
6 sed 的流艺术之三――露几手 144
7 sed 的流艺术之四――插入和控制 147
8 awk 是三兄弟系列之一――入门 152
9 awk 是三兄弟系列之二――多行操作 157
10 awk 是三兄弟系列之三――多文件操作 161
11 awk 是三兄弟系列之四――外部调用 166
12 awk 是三兄弟系列之五――实战 171
13 cut 是修剪小能手 176
14 wc 帮你计算字数 184
15 split 是拆分小能手 188
16 paste 用来拼接 192
17 sort 命令上篇――sort 帮你排序 196
18 sort 命令下篇――关于k 选项的大讨论 201
19 Vi 中的替换艺术 208
20 加密工具全家桶 212
致谢 219
滴滴联合创始人兼CTO 张博
Linux知识晦涩且复杂,很多Linux学习者都有痛苦的看man的经历,作者以生动轻快而不失条理的方式娓娓道来,极大地降低了学习门槛。
如果大家希望了解和精通Linux命令,我认为本书是非常适合的。
宝剑锋从磨砺出,梅花香自苦寒来,很高兴看到鹏冲多年的Linux系统实战经验能够得以沉淀和分享。
小米运维架构师 伏晔
本书作者鹏冲是我多年的同事。在百度期间负责过多个业务的运维和重大项目建设。对Linux应用、网络等方面了解得非常深入,在服务高可用设计方面有着丰富的经验。在刚得知他要写一本Linux基础教程方面的书籍时就非常期待。阅读完初稿后,可以肯定这本书凝结了他多年的实际工作经验,深入浅出地介绍了日常工作中所需要的各种专业技能。希望本书能够帮助更多的初学者进入Linux世界,进入运维行业。
京东资深技术专家 臧志
Shell是工程师们的瑞士军刀,能够极大地提高日常的工作效率,是互联网技术从业者的必备工作技能。作者从一个资深互联网工程师角度出发,以轻松但又不乏严谨与深度的文笔介绍了常使用的命令,并辅以丰富的实际工作案例,不仅适合快速入门上手,也适合床头案边随时查阅。
“运维帮”创始人 窦喆
Shell和系统工具对于运维工程师来说是必备的技能,日常工作天天需要,初学者如果打好基础,日后工作必会终身受益,本书作者大棚有多年实战经验,教你玩转Linux,强烈推荐本书放在桌面,随时查阅。
百度架构师 王达心
本书出自具有多年百度一线工作经验的工程师之手,与大部头的教科书相比,更侧重当下实用的Shell应用技能,可以快速上手,简单实用。
百度运维专家、监控专家 曲显平
本书的作者拥有7年大型互联网公司Linux系统运维经验,他将多年来在Linux系统运维领域的知识、经验凝结成文,内容循序渐进,笔法诙谐有趣。本书能够让你在不知不觉中掌握Linux系统运维的关键技术和方法,是能够指导Linux系统初学者和Linux运维工程师进阶的佳作。
蓝汛技术总监 陈江伟
鹏冲有着丰富的研发、运维经验,非常了解大家实际的需求和痛点。而他的总结、表达能力出类拔萃。拿到书稿,果不其然,图文并茂,绘声绘色,这部书完全满足了我对Linux命令书籍的所有想象,是一本不可多得的好书。