14、Linux运维高级系统应用-glob通配及IO重定向,,50R

上节课我们讲解了bash的许多特性,主要涉及以下几点。

  • 命令补全
  • 路径补全的方式
  • 命令的引用
  • 文件或者目录的复制,移动,删除
  • 变量的相关话题,包括变量类型,变量的存储格式,数据范围


bash的基础特性续讲解

globbing,文件名通配机制。对文件的管理和操作

一种匹配模式,然后实现对多个文件的同时操作能力

元字符,正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

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

    ?用来匹配任意的单个字符字符

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

    有几种特殊的格式,

    [a-z]   任意的一个字母 ,不区分大小写

    [0-9]  任意的一个数字

    [a-z0-9]  任意的一个数字或者一个字母

    [qwerasdf] 方括号内的任意一个字母


例子:

文件名称当中以 sys字符串开头的文件   sys*

文件名称当中包含sys字符串的文件        *sys*

文件名称以任意字符开头,fig字符串结尾的文件     *fig

文件名称以任意位置出现sy  和s的文件     *sy*s*

文件名称当中以 pa字符串开头,后面跟任意单个字符的文件   pa?

文件名称以pa结尾,前面有任意2个字符的文件   ??pa

文件名称以p开头,a结尾,中间只有一个字符的文件   p?a

文件名称以p开头,中间一个任意字符,后面跟字符a,a后面跟任意单个字符的文件   p?a?

文件名称以pa开头,后面跟一个数字的文件  pa[0-9]

文件名称以pa开头,后面跟2个数字的文件  pa[0-9][0-9]

表示一个200至299之间的任意一个数值的数字,2[0-9][0-9]


例子:

1、查看etc目录下,所有以pa开头的文件

[root@c7-virtualtest1 ~]# ls -d /etc/pa*

/etc/pam.d  /etc/passwd  /etc/passwd-

2、查看etc目录下,所有以pa开头,后面跟4个任意字符的文件

[root@c7-virtualtest1 ~]# ls -d /etc/pa????

/etc/passwd

3、查看tmp目录下,

所有以p开头,后面跟任意字符,并且以a结尾的文件

所有以p开头,后面跟任意单个字符,并且以a结尾的文件

所有以p开头,后面跟任意单个字符,并且以a结尾的文件

所有以任意字母开头,后面跟任意2个数字,并且以a结尾的文件,文件名匹配时,[a-z]不区分字符大小写

[root@c7-virtualtest1 ~]# cd /tmp

[root@c7-virtualtest1 tmp]# touch p6a p9a p2a pua pta  U67a X67a  Q56a  pa9 p23a qpa up906az  \A88889k

[root@c7-virtualtest1 tmp]# ls p*a

[root@c7-virtualtest1 tmp]# ls p?a

[root@c7-virtualtest1 tmp]# ls [a-z][0-9][0-9]a

4、查看/var/log/目录下,所有以  .log    结尾的文件

[root@c7-virtualtest1 tmp]# ls /var/log/*.log

5、所有以大写字母开头,后面跟任意2个数字,并且以a结尾的文件

其他几种字符数字集合表示方式有如下几种

[[:upper:]]   表示所有的大写字母,外层的中括号是指定范围的,里面是固定格式

[[:lower:]]        表示所有的小写字母

[[:alpha:]]  [a-z]   表示所有的字母集合

[[:digit:]]   表示所有的数字集合

[[:alnum:]]   表示所有的字母和数字

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

[[:punct:]]   表示所有的标点符号

[root@c7-virtualtest1 tmp]# ls [[:upper:]][0-9][0-9]a

6、查看所有以u开头后面跟一个标点符号,然后后面是任意字符的文件

[root@c7-virtualtest1 tmp]# touch u,u

[root@c7-virtualtest1 tmp]# ls  b[[:punct:]]*

7、查看所有以u开头后面跟一个空白字符,然后后面是任意字符的文件

[root@c7-virtualtest1 tmp]# touch u\ t

[root@c7-virtualtest1 tmp]# ls u[[:space:]]*

[root@c7-virtualtest1 tmp]# rm -rf u\ t         //删除特殊文件时,要注意其特有格式

8、查看所有以u开头,后面跟一个非数字或者字母的字符,然后后面是任意字符的文件

非字符数字集合表示方式有如下2种

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

[^[:upper:]]  [^0-9]

[root@c7-virtualtest1 tmp]# ls u[^[:alnum:]]*


练习题目

1、显示/var/log目录所有以messages开头,后面跟一个非数字或者字母的字符,然后后面是任意字符的文件

[root@c7-virtualtest1 log]# ls /var/log/messages[[:punct:]]*

2、显示/var/log目录所有以l开头,后面跟一个数字,最后有一个小写字母的文件

[root@c7-virtualtest1 log]# touch l8u  l4t l3k l2n l1h l9g

[root@c7-virtualtest1 log]# ls  -d  /var/log/l[0-9][[:lower:]]

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

[root@c7-virtualtest1 log]# ls  -d  /etc/[0-9]*[^0-9]

4、显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或者目录文件

[root@c7-virtualtest1 log]# ls  -d  /etc/[^a-z][[:alpha:]]*

5、复制/etc目录下,所有以m开头,以非数字结尾的文件或者目录至/tmp/目录

[root@c7-virtualtest1 log]#cp  -r /etc/m*[^[:digit:]]  /tmp/

6、复制/usr/share/man目录下,所有以man开头,第二个字符是数字,后面任意的文件或目录至/tmp/man/目录下

[root@c7-virtualtest1 log]#mkdir  /tmp/man

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

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

[root@c7-virtualtest1 log]#mkdir   -p /tmp/conf.d/kk

[root@c7-virtualtest1 log]#cp  -r  /etc/[mnrp]*.conf   /tmp/conf.d/kk/

[root@c7-virtualtest1 ~]# ll  /etc/[mnrp]*.conf

8、永久修改发行版本为centos7操作系统的主机名

[root@c7-virtualtest1 ~]# hostnamectl --static set-hostname c7-virtualtest1



IO重定向及管道讲解

输入本来默认是键盘,我们改成其他输入,就是输入重定向 :例如从文本文件里输入。

本来输出的位置是显示器,我们改成其他输出,就是输出重定向:例如输出到文件。

程序由数据加指令组成

程序的数据流有以下几种:

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

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

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

文件描述符介绍:

在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件 所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误

标准输入输出说明

stdin,标准输入,默认设备是键盘,文件编号为0

stdout,标准输出,默认设备是显示器,文件编号为1,也可以重定向到文件

stderr,标准错误,默认设备是显示器,文件编号为2,也可以重定向到文件

IO重定向是一个过程描述,这个过程捕捉一个文件或者命令,程序,脚本等的输出物A,然后把输出物A送给另外一个文件,命令,程序或者脚本。类似于绑钓鱼线组的过程,中间物是八字环。

命令 说明

command > file 将输出重定向到文件,此输出是覆盖输出重定向,会覆盖重定向位置的文件里的内容

command < file 将输入重定向到文件

command >> file 将输出以追加的方式重定向到文件。

n > file 将文件描述符为 n 的文件重定向到 file。

n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。

查看/etc下得文件内容,然后将查看结果输出重定向到/tmp/a.txt文件当中。

[root@c7-virtualtest1 ~]# ls /etc/ >/tmp/a.txt

[root@c7-virtualtest1 ~]# cat /tmp/a.txt

[root@c7-virtualtest1 ~]# ls /var/ >/tmp/a.txt    //比较危险的操作,会冲刷掉原来的a.txt中的文件内容

[root@c7-virtualtest1 ~]# cat /tmp/a.txt

查看当前系统下,我们所登录的虚拟终端类型的方式,并将查看到的/etc,输出到此终端上

[root@c7-virtualtest1 ~]# tty

[root@c7-virtualtest1 ~]# ls /etc/ >/dev/pts/0

查看/etc/fstab文件的内容,并输出重定向至文件/tmp/a.txt,查看/tmp/a.txt的内容

[root@c7-virtualtest1 ~]# cat /etc/fstab

[root@c7-virtualtest1 ~]# cat /etc/fstab >>/tmp/a.txt

[root@c7-virtualtest1 ~]# cat /tmp/a.txt


set命令Shell内建命令

set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。

-C:禁止重定向产生的文件覆盖已存在的文件。

+C:关闭此特性,补充:仅当前shell下有效

[root@c7-virtualtest1 ~]# type set

set is a shell builtin

[root@c7-virtualtest1 ~]# help set



验证使用set   -C  命令之后,覆盖输出重定向将无法执行成功

查看/etc/fstab文件的内容,并输出重定向至文件/tmp/a.txt,查看/tmp/a.txt的内容

[root@CC7 ~]# set -C

[root@CC7 ~]# cat /etc/fstab

[root@CC7 ~]# cat /etc/fstab >/tmp/a.txt

-bash: /tmp/a.txt: cannot overwrite existing file

临时,一次性操作,强行做覆盖输出

[root@CC7 ~]# cat /etc/fstab >|  /tmp/a.txt


错误输出重定向,覆盖性质的  2>   ,错误输出重定并追加至文件内容后面,  2>>

错误是另外的一种输出流,不会在我们的标准输出流中显示

[root@c7-virtualtest1 ~]# ls /var/sssss > /tmp/a.cpp

ls: cannot access /var/sssss: No such file or directory

[root@c7-virtualtest1 ~]# ls /var/sssss > /tmp/a.cpp



使用错误输出重定向,再次执行命令,不会报错

[root@c7-virtualtest1 ~]# ls /var/datepp 2> /tmp/a.cpp

[root@c7-virtualtest1 ~]# cat  > /tmp/a.cpp   //错误输出被保存在a.cpp文件当中

合并标准输出流和错误输出流。&>

第二种合并正确和错误输出流的方式:[root@c7-virtualtest1 ~]#  cat /etc/fstab > /tmp/ab.txt  2>&1

查看/etc/fstab文件,重定向至/tmp/fstab.out,使用合并输出流选项,界面将不再报错。

[root@c7-virtualtest1 ~]# cat /etc/fstab &> /tmp/fstab.out

[root@c7-virtualtest1 ~]# cat /etc/fstabgg &> /tmp/fstab.out

[root@c7-virtualtest1 ~]# cat /tmp/fstab.out

cat: /etc/fstabgg: No such file or directory

[root@c7-virtualtest1 ~]# cat /etc/fstab &> /tmp/fstab.out

[root@c7-virtualtest1 ~]# cat /tmp/fstab.out

#

# /etc/fstab

# Created by anaconda on Mon Dec 16 11:44:53 2019

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=03b3dd60-6a04-4660-9029-872eca896e39 /                       xfs     defaults        0 0

输入重定向,

Linux tr命令,Linux tr 命令用于转换或删除文件中的字符。tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

将文件testfile中的小写字母全部转换成大写字母,此时,可使用如下命令,并不修改源testfile本身的内容:

cat testfile |tr a-z A-Z

testfile文件中的内容如下:

$ cat testfile         #testfile原来的内容  Linux networks are becoming more and more common, but scurity is often an overlooked   issue. Unfortunately, in todays environment all networks are potential hacker targets,  fro0m tp-secret military research networks to small home LANs.  Linux Network Securty focuses on securing Linux in a networked environment, where the   security of the entire network needs to be considered rather than just isolated machines.  It uses a mix of theory and practicl techniques to teach administrators how to install and  use security applications, as well as how the applcations work and why they are necesary.

使用 tr 命令大小写转换后,得到如下输出结果:

# cat testfile | tr a-z A-Z #转换后的输出  LINUX NETWORKS ARE BECOMING MORE AND MORE COMMON, BUT SCURITY IS OFTEN AN OVERLOOKED   ISSUE. UNFORTUNATELY, IN TODAYS ENVIRONMENT ALL NETWORKS ARE POTENTIAL HACKER TARGETS,  FROM TP-SECRET MILITARY RESEARCH NETWORKS TO SMALL HOME LANS.  LINUX NETWORK SECURTY FOCUSES ON SECURING LINUX IN A NETWORKED ENVIRONMENT, WHERE THE   SECURITY OF THE ENTIRE NETWORK NEEDS TO BE CONSIDERED RATHER THAN JUST ISOLATED MACHINES.  IT USES A MIX OF THEORY AND PRACTICL TECHNIQUES TO TEACH ADMINISTRATORS HOW TO INSTALL AND   USE SECURITY APPLICATIONS, AS WELL AS HOW THE APPLCATIONS WORK AND WHY THEY ARE NECESARY.

tr命令修剪重定向内容后的效果

#tr a-z A-Z  <./testfile


/dev/null, 软件设备,bit bucket,数据黑洞,将内容输出定向到该设备下无任何返回内容

<<  这个符号的的作用是创建文档,最后的结束符号,一定要顶格写



cat > /etc/sysconfig/network-scripts/ifcfg-ethx   <<EOF

TYPE="Ethernet"

PROXY_METHOD="none"

BROWSER_ONLY="no"

BOOTPROTO="dhcp"

DEFROUTE="yes"

IPV4_FAILURE_FATAL="no"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

IPV6_DEFROUTE="yes"

IPV6_FAILURE_FATAL="no"

IPV6_ADDR_GEN_MODE="stable-privacy"

NAME="eth0"

UUID="96d84f9e-9345-417c-9ccf-f6195d2e282a"

DEVICE="eth0"

ONBOOT="yes"

EOF


管道命令详解


管道是将前一个命令的输出作为后一个命令的输入

命令1 | 命令2 | 命令3 | ......

# echo "hello world." | tr 'a-z' 'A-Z'

//输出字符串,并将字符串按大写格式输出

# echo "redhat" | passwd --stdin centos

//打印字符串,并将字符串更新为centos用户的密码

# cut -d: -f1 /etc/passwd | sort | tr 'a-z' 'A-Z'

将X文件以冒号为分割符号,取第一个字段,sort可针对文本文件的内容,以行为单位来排序。最后将截取的字段的小写字母转换为大写。

# echo "Hello,World." | tee /tmp/hello.out

tee: 显示内容并将内容保存在文件中打印字符串,并将字符串的结果打印输出至文件。

# wc -l /etc/passwd | cut -d' ' -f1

wc  -l    统计文本的行数

将输出的结果以空格为分隔符,取第一个字段

练习:    

1、统计/usr/bin/目录下的文件个数;

# ll /usr/bin | wc  -l    

2、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示;

# cut -d : -f7 /etc/passwd | sort -u    

3、显示/var/log目录下每个文件的内容类型?

# file /var/log/*    

4、取出/etc/inittab文件的第5行;

# head -5 /etc/inittab | tail -1 先取前六行然后通过管道取最后一行    

5、取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中;

# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users

# echo  `tail -9 /etc/passwd | head -1 | cut -d: -f1,7` >/tmp/users1

不打印到屏幕,保存至/tmp/users1    

6、显示/etc目录下所有以pa开头的文件,并统计其个数;

# ls -d /etc/pa* | wc -l    

7、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中;

echo "alias cls=clear" >>.bashrc

        tail .bashrc

        //tail命令默认查看显示文件的最后10行。

8、查看最近登录系统的2个用户;

# last  | head -2

9、把/etc/passwd文件的前6行的信息转换为大写字符后输出;

# # head -6 /etc/passwd | tr 'a-z'  'A-Z'

10、查看文件/etc/issue是否存在,不显示;

# head -10 /etc/passwd | tail -1 &>/dev/null

# echo $?

    &>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中


猜你喜欢

转载自blog.51cto.com/30bear/2633730