Chinaunix首页 | 论坛 | 博客
  • 博客访问: 502290
  • 博文数量: 164
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 2240
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-07 12:55
文章存档

2008年(164)

我的朋友

分类: LINUX

2008-03-28 18:35:21

9    Linuxshell配置、重定向及管道

1   bash shell 的设定文件

我们需要有几个文件来帮助我们,每次登入的时候,就已经帮我们搞定了环境的设定。

1.1系统设定值

所谓的系统设定值,也就是说每个使用者进入到 bash shell 之后,会先读取的设定文件,预设的设定文件有下列几个:

/etc/profile:这个文件设定了几个重要的变量,例如:PATHUSERMAILHOSTNAMEHISTSIZEumask等等,也同时规划出 /etc/inputrc 这个针对键盘热建设定的文件的数据内容。

/etc/bashrc:这个文件在规划 umask 的功能,也同时规划出提示字符的内容(就是里头那个 PS1!)。特别留意的是,这个文件在不同的 Linux distribution 里面,摆放的位置可能不太一样,需要查询一下才行。

/etc/man.config:这个文件或许跟 bash shell 较没相关性,但是对于系统管理员来说,却也是很重要的一个文件。那么什么时候要来修改这个文件呢?如果你是以 tarball 的方式来安装你的数据,那么你的 man page(指令说明文件)可能会放置在 /usr/local/softpackage/man 里头,那个 softpackage 是你的套件名称,这个时候你就得以手动的方式将该路径加到 /etc/man.config 里头,否则使用 man 的时候就会找不到相关的说明档,这就是系统在设定的时候常常会使用的文件。需要特别留意的是,通常设定完了这几个文件之后,都需要先 logout login 之后才会将设定整个启动起来!

1.2个人设定值

个人的喜好设定在个人家目录的几个隐藏文件当中。

底下的 ~ 』代表的是『家目录』的意思:

²        ~/.bash_profile~/.profile ~/.bash_login

里面定义了个人化的路径(PATH)与环境变量的文件名称

²        ~/.bashrc:一般都是在这里设定个人化变量。例如命令别名的设定,路径的重新定义等等。

²        ~/.bash_history:这个文件的用途在于将你曾经使用过的命令记录下来,而当你再次的以上下键搜寻或者直接以 history 搜寻的时候,就可以找到曾经使用过的指令。

需要注意的是 

1)在这一次的执行过程中的指令,将在你离开 shell 之后才会被纪录到这个文件中,否则将只会先被写到暂存内存中;

2)可以藉由 history 这个指令来将里头的纪录搜寻出来;

3)这个文件的指令记录笔数,与 HISTFILE 有关,你可以自行在 ~/.bashrc 里头设定,或者直接由 root /etc/profile 里面统一设定大小。

²        ~/.bash_logout

这个文件则是在注销 shell 的时候, BASH 会为你所做的事情。通常预设是只有clear 清除屏幕这件事情而已,不过,你也可以将一些备份或者是其它你认为重要的工作写在这个文件中。

例子:~/.bashrc 设定如下:

[test @test test]# more .bashrc

# User specific aliases and functions

PATH="/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/sbin:/usr/bin:$PATH"

Export PATH

Alias rm='rm -i'

Alias cp='cp -i'

Alias mv='mv -i'

Alias ll='ls -l'

Alias lm='ls -al|more'

Alias h='history'

# Source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

1.3            source

如果我需要将目前的设定档的内容读入一次,需要重新 logout login 才能够读入,那么有没有办法不注销而直接读入变量设定文件呢?当然可以,就使用 source 即可!

[test @test test]# source 变量设定文件

这个使用的情况在什么时候呢?最常发生在一个人的工作环境分为多重的时候了。举个例子来说,在我的大型主机中,我常常需要负责两到三个不同的案子, 每个案子所需要处理的环境变量订定并不相同,那么我就将这两三个案子分别编写属于该案子的环境变量设定文件,当我需要该环境时,就直接 source 变量文件,如此一来,环境变量的设定就变的更简便而灵活了。

2   Shell常用符号集

2.1      Shell常用符号集

通用shell符号                执行结果

enter                                 执行命令

                                 将同行的命令分开

&&                                

||                           

[ ]                                 匹配[]里面可能出现的字符  [13]  [1-3]

\                            转义字符

|                            管道

&                          在后台执行命令

!                            执行历史命令

#                                  批注

~                                  使用者的家目录

$                                  亦即是变量之前需要加的变量取代值

!                           逻辑运算意义上的『非』 not 的意思!

/                           路径分隔的符号

'                           单引号,不具有变量置换的功能

"                           具有变量置换的功能

` `                                  两个『 ` 』中间为可以先执行的指令!

( )                                  在中间为子 shell 的起始与结束

{ }                                  在中间为命令区块的组合!

 

2.2            通配符

通配符                                功能

*                          通配任意多个字符

?                                    通配任意1个字符

2.3      通配符实例

[test @test test]# ls test* <==那个 * 代表后面不论接几个字符都予以接受(没有字符也接受!)

[test @test test]# ls test? <==那个 ? 代表后面『一定』要接『一个』字符

[test @test test]# ls test??? <==那个 ??? 代表『一定要接三个』字符!

[test @test test]# cp test[1-3] /tmp <== test1, test2, test3若存在的话,就拷贝到 /tmp

[test @test test]# cd /lib/modules/`uname -r`/kernel/drivers <== ` ` 括起来的内容『会先执行』!

3 连续指令的下达方式

两个指令先后写在一起,可以这样写:command1; command2

那么如果我是两个相关的指令,第一个 command1 如果执行结果有错误,第二个就不被执行,可以这样做吗?

command1 && command2

command1 || command2

那么 && 就是代表,当 command1 执行结果传回值为 0 的时候,也就是没有错误讯息时,则command2 才会开始执行,而 || 恰恰相反,当 command1 有错误讯息时, command2 才会执行。

4重定向

4.1      重定向符号

>               输出重定向到一个文件或设备 覆盖原来的文件

>!                      输出重定向到一个文件或设备 强制覆盖原来的文件

>>                       输出重定向到一个文件或设备 追加原来的文件

<                       输入重定向到一个程序 

 

4.2标准错误重定向符号

2>                将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件  b-shell

2>>             将一个标准错误输出重定向到一个文件或设备 追加到原来的文件

2>&1        将一个标准错误输出重定向到标准输出 注释:1 可能就是代表 标准输出

>&          将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件  c-shell

|&           将一个标准错误 管道 输送 到另一个命令作为输入

4.3命令重导向示例

bash 命令执行的过程中,主要有三种输出入的状况,分别是:

1. 标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <

2. 标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>

3. 错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>

[test @test test]# ls -al > list.txt

将显示的结果输出到 list.txt 文件中,若该文件以存在则予以取代!

[test @test test]# ls -al >> list.txt

将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!

[test @test test]# ls -al  1> list.txt   2> list.err

将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err

[test @test test]# ls -al 1> list.txt 2>&1

将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!

[test @test test]# ls -al 1> list.txt 2> /dev/null

将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。

4.4为何要使用命令输出重导向

当屏幕输出的信息很重要,而且我们需要将他存下来的时候;

背景执行中的程序,不希望他干扰屏幕正常的输出结果时;

一些系统的例行命令(例如写在 /etc/crontab 中的文件)的执行结果,希望他可以存下来时;

一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;

错误讯息与正确讯息需要分别输出时。

5   管线命令 ( pipe )

就如同前面所说的, bash 命令执行的时候有输出的数据会出现,那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』。

例子:简单的管线命令

假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?

那么我所进行的步骤是:

1. 执行 last ,将所有这个月的所有人登入数据取出来;

2. 使用 grep 将上面的输出数据(stdout)当中的 root 撷取出来,其它的不要;

3. 使用 wc 这个可以计算行数的指令将上一步的数据计算行数!

由于 last 的输出是一行代表一次登入,所以只要计算几行就代表登入几次的意思,经由上面三个步骤,将 last 数据逐步的筛选,就可以得到我们的数据了!整个命令可以写成如下: [test @test bin]# last | grep root | wc -l

这个管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是standard output ( STDOUT ) 的信息,对于 stdandard error 并没有直接处理的能力。

5.1基本的管线命令指令介绍

cut

语法:[root @test /root ]# cut -d "分隔字符" [-cf] fields

参数说明:

-d :后面接的是用来分隔的字符,预设是『空格符』

-c :后面接的是『第几个字符』

-f :后面接的是第几个区块?

范例:[root @test /root]# cat /etc/passwd | cut -d ":" -f 1

passwd 这个文件里面,每一行里头的 : 用来作为分隔号,而列出第一个区块!也就是姓名所在啦!

[root @test /root]# last | cut -c1-20

last 之后的数据,每一行的 1-20 个字符取出来!

sort

语法:[root @test /root ]# sort [-t 分隔符] [(+起始)(-结束)] [-nru]

参数说明:

-t 分隔符:使用分隔符来隔开不同区间,预设是 tab

+start -end:由第 start 区间排序到 end 区间

-n :使用『纯数字』排序(否则就会以文字型态来排序)

-r :反向排序

-u :相同出现的一行,只列出一次!

范例:[root @test /root]# cat /etc/passwd | sort将列出来的个人账号排序!

[root @test /root]# cat /etc/passwd | sort -t: +2n将个人账号中,以使用者 ID 来排序(以 : 来分隔,第三个为 ID ,但第一个代号为 0 之故)

[root @test /root]# cat /etc/passwd | sort -t: +2nr反相排序啰!

wc

语法:[root @test /root ]# wc [-lmw]

参数说明:

-l :多少行

-m :多少字符

-w :多少字

范例:[root @test /root]# cat /etc/passwd | wc -l这个文件里头有多少行?

[root @test /root]# cat /etc/passwd | wc -w这个文件里头有多少字!?

uniq这个指令用来将『重复的行删除掉只显示一个』

语法:[root @test /root ]# uniq

范例:[root @test /root]# last | cut -d" " -f1 | sort | uniq

tee命令重定向到文件的同时将数据显示在屏幕上

语法:[root @test /root ]# last | tee last.list | cut -d " " -f1

范例:[root @test /root]# last | tee last.list | cut -d " " -f1

tr

语法:[root @test /root ]# tr [-ds] SET1

参数说明:

-d :删除 SET1 这个字符串  

-s :取代掉重复的字符!

范例:[root @test /root]# last | tr '[a-z]' '[A-Z]' <==将小写改成大写

[root @test /root]# cat /etc/passwd | tr -d : <== : 这个符号在 /etc/passwd 中不见了!

[root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM

split

语法:[root @test /root ]# split [-bl] 输入文件 输出文件前导字符

参数说明:

-b :以文件 size 来分

-l :以行数来分

范例:[root @test /root]# split -l 5 /etc/passwd test <==会产生 testaa, testab, testac... 等等的文件

说明:在 Linux 底下就简单的多了!你要将文件分割的话,那么就使用 -b size 来将一个分割的文件限制其大小,如果是行数的话,那么就使用 -l line 来分割!

管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环。

管道输送到一个命令的标准输入可以使用标准输入参数”- 进行更仔细的控制.cat命令的示例

eg:  sort mylist | more

 sort mylist | cat –n | lpr

 pwd | cat – mylist | lpr

阅读(1451) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~