日期:2014-05-16  浏览次数:20703 次

鸟哥的linux私房菜(基础篇--14、认识BASH Shell)笔记2

1、数据流重导向

标准输入(stdin) :代码为 0 ,使用 < 或 << ;
标准输出(stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

?

一串指令的最左边一定是指令,而在 >,2>,< 右边的,必须是档案或装置才行!?

?

? 1> :是将正确的数据输出到指定的地方去
? 2> :是将错误的数据输出到指定的地方去

[dmtsai@linux ~]$ find /home -name testing > list_right 2> list_error

?

如果我只要正确的数据,错误的信息我不要了。

[dmtsai@linux ~]$ find /home -name testing > list_right 2> /dev/null

?

如果我要将数据都写到同一个档案中。

[dmtsai@linux ~]$ find /home -name testing > list 2> list <==错误写法
[dmtsai@linux ~]$ find /home -name testing > list 2>&1 <==正确写法

?

?那个 < 又是什么呀!?

[root@linux ~]# cat > catfile
testing
cat file test
<==这里按下 [ctrl]+d 结束输入来离开!

?

[root@linux ~]# cat > catfile < somefile

?

[root@linux ~]# cat > catfile <<eof
> This is a test testing

> OK now stop
> eof <==输入这个玩意儿,嘿!立刻就结束了!

?

[root@linux ~]# sync; sync; shutdown -h now

?

当前面的指令执行结果为正确 (例如:仅有 standard output 时),就可以接着执行后续的指令, 否则就予以略过!

[root@linux ~]# ls /tmp && touch /tmp/testingagin

?

那个 || 刚好完全跟 && 相反,当前一个指令有错误时,在 || 后面的指令才会被执行!

[root@linux ~]# ls /tmp/vbirding || touch /tmp/vbirding

?

以 ls 测试 /tmp/vbirding 是否存在,若存在则显示 "exist" ,若不存在,则显示 "not exist"!

ls /tmp/vbirding && echo "exist" || echo "not exist"

?

2、一些基本的管线命令指令介绍:

撷取命令: cut, grep

? cut

[root@linux ~]# cut -d'分隔字符' -f fields
[root@linux ~]# cut -c 字符区间
参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;

?

? grep

[root@linux ~]# grep [-acinv] '搜寻字符串' filename
参数:
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

?

排序命令: sort, wc, uniq

? sort

[root@linux ~]# sort [-fbMnrtuk] [file or stdin]
参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(预设是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,预设是 tab 键;
-k :以那个区间 (field) 来进行排序的意思;

?

? uniq

[root@linux ~]# uniq [-ic]
参数:
-i :忽略大小写字符的不同;
-c :进行计数

?

? wc

[root@linux ~]# wc [-lwm]
参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;

范例二:我知道使用 last 可以输出登入者,但是 last 最后两行并非账号内容,
那么请问,我该如何以一行指令串取得这个月份登入系统的总人次?
[root@linux ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
# 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解啰!

?

双向重导向: tee

[root@linux ~]# tee [-a] file
参数:
-a :以累加 (append) 的方式,将数据加入 file 当中!

?

字符转换命令: tr, col, join, paste, expand

? tr

[root@linux ~]# tr [-ds] SET1 ...
参数:
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符!

?

? col

[root@linux ~]# col [-x]
参数:
-x :将 tab 键转换成对等的空格键

?

? join

[root@linux ~]# join [-ti12] file1 file2
参数:
-t :join 预设以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
-2 :代表『第二个档案要用那个字段来分析』的意思。

范例一:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
[root@linux ~]# join -t ':' /etc/passwd /etc/shadow

?

范例二:我们知道 /etc/passwd 第四个字段是 GID ,那个 GID 记录在
/etc/group 当中的第三个字段,请问如何将两个档案整合?
[root@linux ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group

?

? paste

[root@linux ~]# paste [-d] file1 file2
参数:
-d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。

范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起
[root@linux ~]# paste /etc/passwd /etc/shadow

?

范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一