Skip to content

Commit

Permalink
init 14-linux
Browse files Browse the repository at this point in the history
  • Loading branch information
Gwill committed Sep 25, 2012
1 parent ab33f4a commit 83cec3d
Showing 1 changed file with 297 additions and 0 deletions.
297 changes: 297 additions & 0 deletions 14-linux.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
# Linux

> KISS: Keep It Simple, Stupid.
> 程序员有三大美德:懒惰、自负、浮躁。
关于“Linux”这个题目?

首先,现在OS X大行其道,虽然与Linux诸多相似,但是OS X却不是Linux,更多底层来自FreeBSD。说回来,Linux众多发行版,有的时候单单用Linux这个词来描述略显无力。所以用“类Unix操作系统”描述会更准确,但是显得又是那么词不达意。


## Unix/Linux设计思想

关于Unix/Linux设计思想、设计哲学总结已然很多。(参看Wikipedia相关条目)

1994 年,Mike Gancarz 又给出了如下总结:

- Small is beautiful.
- Make each program do one thing well.
- Build a prototype as soon as possible.
- Choose portability over efficiency.
- Store data in flat text files.
- Use software leverage to your advantage.
- Use shell scripts to increase leverage and portability.
- Avoid captive user interfaces.
- Make every program a filter.

比起这些冗长的总结(其实已经不算长了,对于Unix/Linux设计哲学的探讨早已成书)。我更喜欢这一句:

Keep it Simple, Stupid.

从中我们不难梳理出这样一条脉络:

每个程序只处理好一件事情,对于复杂的事情则需要各个程序协同处理,可以协作的基础就是有统一的标准和协议,从人本角度出发选用文本作为信息载体。

## Shell文本处理

好吧,为了让自己的写的动态不那么像胡扯(其实就是),我们来给这章起一个靠谱的标题:

类Unix操作系统中命令行shell下各种字符处理工具综述

刚才我们谈了Unix/Linux设计思想,无疑最能体现这些Unix哲学的地方就是shell中。

那么这种协作的具体实现是什么呢?

管道

语法表现就是简单的竖线“|”

a | b

其意思就是,将a处理后的标准输出作为b处理时的标准输入。

标准的统一为分布处理打下了坚实的基础,文本化使得抽象的计算机处理更加人性化。

当然,文本化也不全是优点,文本化给人类提供了便捷,也给整个系统引入了熵。(参看王垠博客文章) http://blog.sina.com.cn/s/blog_5d90e82f01014k5j.html


### 关于演示的约定

不管是叫命令,还是叫程序都感觉不是非常准确,不妨我们就将这些东西命名未工具。

一下参数中所谓的[文件],也可以看作是标准输入,某种角度上来说这也反映着Unix设计哲学,即将一切看作文件。

一下所罗列的工具,很多没有给出全部的参数和使用,我只将有关与文本处理相关

因为“大集市”的特性,很多工具都有不同的风格,体现在工具的帮助上就是查看工具的帮助有各种不同的方式。

您可以尝试一下途径获取工具的使用说明:

man [工具名]

[工具名] -h

[工具名] --help

[工具名] --usage

范例文件:

有文件file,内容如下

```
one
two
three
```

#### echo

将一个字符串标准输出,往往作为管道的发起使用

语法

echo [字符串]

标准输出

```
~$ echo "Hello World"
Hello World
```

将“Hello World”利用管道传给“wc -w”处理,关于wc工具我们后文详述。

```
~$ echo "Hello World" | wc -w
2
```

#### cat

语法

cat [参数] [文件]

将文件内容标准输出

所以我们可以将file内容输出:

```
~$ cat file
one
two
three
```

参数

-b 输出行号


```
~$ cat -b file1
1 one
2 two
3 three
```

#### yes

不停的输出字符,默认为“y”。

>读者一定要问,这么会有这样的工具存在?其实不难理解,往往在命令行下操作是,我们总会遇到程序各种交互提问,这些答案往往都是y(因为你毕竟要做一些事情)。根据Unix的哲学,一个工具就干好一件事情,所以懒惰的程序员就编写了一个只帮你输入y的程序。

语法

yes [字符串]

一直输出“y”

```
~$ yes
y
y
```

一直输出“no”

```
~$ yes no
no
no
...
```

#### cat

#### tac

#### rev

#### nl

#### head

####tail

### 搜索相关

#### grep

内使用正则表达式搜索文件内匹配的行



#### wc

文本计数

语法

wc [参数] [文件]

参数

-c

按byte计数

```
~$ wc -c file
14 file
```

-m

按字符计数

```
~$ wc -m file
14 file
```

-l

按行计数

```
~$ wc -l file
3 file
```

-w

按单词计数

```
~$ wc -w file
3 file
```

### 排序相关

#### sort

#### tsort

#### uniq

### 比较相关

#### comm

#### diff

### 序列相关

#### shuf

### 文本内容操作

#### cut

#### paste

### 字符操作

#### tr

#### expand

### 表格操作

#### colrm

### 文本切割

#### split

### 编码转换

#### iconv

### 格式化输出

#### column

### 神器

#### sed

#### awk

## 组合处理演示

## 后记

从这些工具我们可以了解,经过长期的历史积淀。
在Linux下,各种有可能遇到的问题都有了不错的解决方案。

以Linux的设计思想的角度来说,我们站在前人的肩膀上,将这些工具为我所用。

逆向思维的角度来看,如果你遇到的一个问题没法解决,那么十有八九是你的问题不对。
当然也不排除,你在解决前人还没有解决的问题,或者是利用这些工具组合都无法解决的问题。

0 comments on commit 83cec3d

Please sign in to comment.