回顾:

         bash基础特性:

                   命令补全,路径补全,命令引用,文件或目录的复制,移动,删除,

                   变量:变量的类型

                          存储格式,数据范围,参与运算

 

 

bash的基础特性:

 

         globbing:文件名通配(整体文件名匹配,而非部分),

                   一定注意这个通配是文件名的通配,所以查看的时候,是写/路径/通配的文件名

                   匹配模式:

                            元字符

                                     *  匹配任意长度的任意字符

                                               pa*

                                                        pa,  paa, passwd

                                               匹配文件中出现pa字符:*pa*

                                               匹配以pa结尾:   *pa

                                               匹配文件名有pa  *p*a*       //但是这种方式只能匹配pa                                                                                                               前的

                                     ?:      匹配任意单个字符

                                               pa?

                                                        pa(不符合), paa(符合), passwd(不符合)

                                               ??pa:(表示以pa结尾,前面出现任意两个字符)

                                               ????pa:   表示匹配pa前面有四个字符

                                               p?a,        p?a?

                                     []:     匹配指定范围内的任意单个字符

                                               有几种特殊的格式:

                                                        [a-z][A-Z]:     a-z范围内,匹配任意一个字母,不区分大小写;                                                        [0-9]:         表示在0-9范围内匹配任意一个数字

                                                        [a-z0-9]:   表示匹配任意一个字母或者数字

                                                        [[:upper:]]:        匹配任意一个大写字母,([:upper:]相当a-zA-Z                                                                                   是一个固定格式,外面的[]则表示范围)

                                                        [[:lower:]]:        所有小写字母

                                                        [[:alpha:]]:        所有字母

                                                        [[:digit:]]:          所有数字

                                                        [[:alnum:]]:       所有字母和数字

                                                        [[:space:]]:        所有的空白字符

                                                        [[:punct:]]:        所有标点符号

                            举例:

                            [abcxyz]:  表示从abcxyz6个字母中间匹配一个字符,且只能匹配一个   

                            pa[0-9]:    表示匹配pa后面有一个数字

                            pa[0-9][-0-9]:   表示匹配pa后面有两个数字

列出一个目录下的子目录:ls -d 目录名

                                     [^]:   匹配指定范围外的任意单个字符

                   举例:

                            [^[:upper:]]:     匹配除大写字母之外的任意单个字符

                            [^0-9]:      匹配除数字之外的任意单个字符

                            [^[:alnum:]]:     匹配非正常的任意单个字符

练习:

1.显示/var目录所有以l开头,以一个小写字母结尾,且中间出现一位数字的文件或目录

         [root@localhostetc]# ls /var/l?[[:lower:]]

         [root@localhostetc]# ls -d /var/l?[[:lower:]]                    //-d选项后只显示一级子目录

         /var/lib  /var/log

         [root@localhostetc]#

         ls中的-d选项对文件没有影响。

 

2.显示/etc/目录下,以任意一位数字开头,且以非数字结尾的文件或目录

         [root@localhost~]# ls -d /etc/[[:digit:]]*[^[:digit:]]

        

         [root@localhostetc]# ls -d /etc/[0-9]*[^0-9]

 

3.显示/etc目录下,以非字母开头,后面跟一个字母及其他任意长度任意字符文件或目录

         [root@localhost~]# ls /etc/[^a-z][a-z]*

        

        [root@localhost ~]# ls /etc/[^[:alpha:]][[:alpha:]]*

 

4.复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录;

         [root@localhosthello]# mkdir /tmp/magedu.com

         [root@localhost etc]# cpm*[^[:digit:]]  /tmp/magedu.com         //不完美

         [root@localhostetc]# cp -r /etc/m*[^[:digit:]]  /tmp/magedu.com

 

        

5.复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下

         [root@localhostman]#cd /usr/share/man

         [root@localhost man]# cpman[[:digit:]]  /tmp/man             //不对,因为源文件没有路径

正确结果:    

         [root@localhosttmp]# mkdir /tmp/man

         [root@localhosttmp]# cp -r/usr/share/man/man*[0-9] /tmp/man

         拓展可以查看一下文件/tmp/man的大小

         [root@localhostconf.d]# du -sh /tmp/man

         28M /tmp/man

         [root@localhostconf.d]#

         6.复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d目录下;

         [root@localhosthello]# cd /etc

        [root@localhost etc]# mkdir /tmp/conf.d

         [root@localhostetc]# cp [mnrp]*.conf /tmp/conf.d/

正确结果:

         [root@localhostman]# cp -r /etc/[mnrp]*.conf/tmp/conf.d

 

IO重定向及管道:                  //bash的重要特性

        

         程序:指令+数据

我们单独执行cat

         glob及IO重定向_IO

是一个标准的输出,我们要退出cat,则我们执行ctrl+c

         程序也必须有IO

                   可用的输入设备:文件

                            键盘设备,文件系统上的常规文件,网卡等

                   可用于输出的设备:文件

                            显示器,文件系统上的常规文件,网卡等。

错误输出,与程序的正常执行没有关系

                   程序的数据流有三种:

                            输入的数据流:<-- 标准输入(stdin,默认为:键盘

                            输出的数据流:--> 标准输出(stdout,默认为:显示器

                            错误输出流:         -->错误输出(stderr,),默认为:显示器

在系统内部通常都会把每一个文件加载完成以后,用唯一的数字来表示,这个数字就叫做fd

         fd:fliedescriptor::文件描述符

         标准输入:0

         标准输出:1

         错误输出:2

 

 

IO重定向

         输出重定向: >              //这个符号很危险,要慎用。

                   特性:覆盖输出

         输出重定向: >>

                   特性:追加输出

                            [root@localhost~]# cat /etc/fstab>> /tmp/issue.out

 

为了避免误操作导致的风险,我们可以使用set命令

[root@localhost ~]# type set

set is a shell builtin                    //set是内建命令

[root@localhost ~]# help set

可以看到set的用法:

         设置或撤销shell选项的值以及位置参数

 用选项

         -C(该选项是大写字母)     If set, disallowexisting regular files to be overwritten

                                                        by redirection of output.(翻译:如果设置,不允许现有的常                                               规文件被覆盖通过重定向输出。 

说白了,选项-C就是将覆盖重定向的一些功能关闭了

set -C     //功能就是:禁止覆盖重定向至已存在的文件

                   如果想强制覆盖则用: >|

set +C       //关闭上述功能

                   set -C 仅对当前shell有效       

演示:

         [root@localhost~]# set -C                //将覆盖功能关闭

         [root@localhost~]# cat /etc/issue > /tmp/issue.out

         -bash:/tmp/issue.out: cannot overwrite existing file   //提示无法覆盖已存在的文件

         [root@localhost~]#                 

如果我们在不关闭set -C这个功能的情况下,还要进行一次覆盖,那么我们就在覆盖重定向符号后面加一个竖杠“|”即“>|”,表示强制覆盖。

演示:

         [root@localhost~]# set -C

         [root@localhost~]# cat /etc/issue > /tmp/issue.out

         -bash:/tmp/issue.out: cannot overwrite existing file

         [root@localhost~]# cat /etc/issue >|/tmp/issue.out

         [root@localhost~]#

 

注意:上面的输出重定向,和追加重定向,都是正确结果的输出。如果是错误结果输出流,则不进行重定向输出

         举例:

         [root@localhost~]# cat /etc/issuel> /tmp/issue.out

         cat: /etc/issuel: No such fileor directory         //不会将结果输出到目标文件中

         [root@localhost~]#

         [root@localhost~]# cat /etc/issue> /tmp/issue.out     //这样就可以了,要想将错误结果输                                                                                                         出到目标文件,则用错误输出重定                                                                                                                  向: 2>

         [root@localhost~]#

 

 

错误输出流重定向:

                   2>:             //错误覆盖重定向

                   2>>:          //错误覆盖追加重定向

       注意:2> ,>>之间是不能有空格的。

 

 

 

合并正常输出流和错误输出流:

         第一种方式:

 

         &>             //将正确的或错误的都能输出到目标文件

         &>>           //追加输出正确和错误的输出流。

         第二种方式:

         COMMAND> /PATH/TO/SOMEFILE 2>&1      //后面的符号2>&1不变,表示的意思和前面

         COMMAND>>/PATH/TO/SOMEFILE 2>&1                                                                          符号相同

特殊设备:

/dev/null:是一个软设备,一个假设备,是个无敌同,以后可以在执行命令时,可以讲输出的结果输出到 /dev/null.,可以作为数据重定向的目标。

在执行命令时,我们在只关心命令的成功与失败,不关心其输出的结果时,则可以将输出的信息重定向到/dev/null中。

演示:

         [root@localhost~]# lss /var &>/dev/null

         [root@localhost~]# echo $?            //我们只关心结果

         127

         [root@localhost~]# ls /var &> /dev/null

         [root@localhost~]# echo $?

         0

         [root@localhost~]#

 

上面的混合输出还可以用另一种方法实现:也能将正确错误结果定向到同一个文件中

        

 

        

演示:

 [root@localhost~]# cat /etc/rc.d/init.d/functions> /tmp/function.out 2>&1

[root@localhost ~]#cat /etc/rc.d/init.d/function2s>>  /tmp/function.out 2> &1

                                                                                                                                                                                                                                                                                                  这后面是不能使用两个>>2>>

 

输入重定向:

         <

 

tr命令:

         translateor delete characters(翻译:转化或删除字符)

         语法:

                   tr[OPTION]... SET1 [SET2]

把输入的数据中的字符,凡是在set1定义范围内出现的,全部对位转换为SET2出现的字符

         举例:

                   trabc ABC //表示对于输入的数据中如果出现abc中的字符,全部替换为ABC中的字符

         我们还发现SET2是可以省略的。

         tr命令如果处理文件,则需要用到输入重定向“<”,因为tr只能读取标准输入的命令

演示一:

         [root@localhost~]# tr [a-z] [A-Z]    //执行tr命令后,我们在下面的输入对话框中输入内容,如果想删除,只按BACK SPACE键是不能删除的,会出现下面的显示,我们需要按

ctrl+BACKSPACE将其删掉

         ASDF^H^H^H^H

演示二:

[root@localhost ~]# tr [a-z] [A-Z]   //将输入的内容全部转化成大写

hello everyone

HELLO EVERYONE

^C                                //ctrl+c结束

[root@localhost ~]# tr [a-z] [A-Z] </etc/issue                  //将文件的内容作为处理的数据要用到<

CENTOS RELEASE 6.8 (FINAL)

KERNEL \R ON AN \M

 

[root@localhost ~]#

 

选项:

-d:    删除输入数据中的set1指定的字符

-s或—squeeze-repeats :把连续重复的字符以单独一个字符表示

 

演示:

[root@localhost ~]# cat /etc/issue

CentOSrelease 6.8 (Final)

Kernel \r on an \m

 

[root@localhost ~]# tr -d '[[:digit:]]'< /etc/issue             //在输出的时候删除了输入数据中的数                                                                                                    

CentOSrelease . (Final)

Kernel \r on an \m

 

[root@localhost ~]#

 

[root@localhost testdir]# cat file1

a         d            b             v

[root@localhosttestdir]# cat file1 | tr -s ''                       也可以写成xargs

a d b v

[root@localhost testdir]#

 

总结:

tr命令的两种用法:

         用法一:

                   trSET1 SET2 < /PATH/TO/SOMEFILE

         用法二:

                   tr-d SET1 < /PATH/TO/SOMEFILE

注意:tr命令不修改源文件内容,仅仅是在读取的时候讲显示的内容做处理。

 

 

<<命令符号

         HereDocument: <<                   //此处创建文档符

         用法:

                   用法一:cat << EOF

演示:

[root@localhost ~]# cat << EOF    //表示cat一次性输出前面输入的内容,最后结束符EOF可以                                                           随便定义,一般使用EOF

> HELL

> nihao

> beijing

> EOF

HELL

nihao

beijing

[root@localhost ~]#

                   用法二:cat >/PATH/TO/SOMEFILE <<EOF

演示:

[root@localhost ~]# cat > /tmp/haha<<EOF           //将输入的内容添加到文件/tmp/haha

> HE

> hello

> nihao zhongguo

> heihei

> EOF

[root@localhost ~]# cat /tmp/haha                  //验证内容

HE

hello

nihao zhongguo

heihei

[root@localhost ~]#

 

 

管道

         连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流

                   语法:

                            COMMAND1| COMMAND2 | COMMAND3 | ...

演示:

         [root@localhost~]# who

         root     tty1         2016-09-22 09:04 (:0)

         root     pts/0        2016-09-22 10:14 (10.1.250.23)

         [root@localhost~]# who |head -1

         root     tty1         2016-09-22 09:04 (:0)

         [root@localhost~]# who | head -1 | tr 'a-z' 'A-Z'

         ROOT     TTY1         2016-09-22 09:04 (:0)

         [root@localhost~]# who | head -1 | tr'a-z' 'A-Z' |tr -d '0-9'           //linux重要思想,结合多个                                                                                                                                    小命令完成复杂操作

         ROOT     TTY        -- : (:)

         [root@localhost~]#

 

tee命令:

         COMMAND1| tee PATH/TO/SOMEFILE|COMMAND2

         完成两道输出,一道输入。

演示:

         [root@localhost~]# cat /etc/issue | tee/tmp/issue.tee | tr 'a-z' 'A-Z'

CENTOS RELEASE 6.8 (FINAL)

KERNEL \R ON AN \M

 

 [root@localhost ~]# cat /tmp/issue.tee

CentOS release 6.8 (Final)

Kernel \r on an \m

 

[root@localhost ~]#上述操作显示:tee命令,不仅能将输入的数据保存到自己后面的文件,还能将数据输出屏幕显示,还有将数据输送给tr命令

练习:

         1./etc/passwd文件的前6行的信息转化为大写字符后输出

                   三种方法:

         [root@localhost~]# head -n 6 /etc/passwd | tr 'a-z' 'A-Z'

         [root@localhost~]# head -n 6 /etc/passwd | tr [[:lower:]] [[:upper:]]

         [root@localhost~]# head -n 6 /etc/passwd | tr '[[:lower:]]' '[[:upper:]]'

 

         2.将当前系统登录用户的信息转换为大写后保存至/tmp/who.out 文件中

                   两种方法:

         [root@localhost~]# who |tr 'a-z' 'A-Z'|tee /tmp/who.out

         [root@localhost~]# who |tr 'a-z' 'A-Z'> /tmp/who.out

 

         3./root/ 下文件列表,显示成一行,并文件名之间用空格隔开

         [root@localhosttestdir]# ls /root | xargs

 

         4.file1 文件 内容为:”1 2 3 45 6 7 8 9 10

         [root@localhosttestdir]# cat file1 |tr ',' '+'|bc