3. Linux文件名通配glob以及io重定向

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

匹配模式:元字符

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

[root@myEcs tmp]# ls -d /etc/pa*                           //查看etc下所有以pa开头的文件
/etc/pam.d  /etc/papersize  /etc/passwd  /etc/passwd-  

 ?:用于匹配任意单个字符

[root@myEcs tmp]# ls  /etc/passw?                         //匹配以passw开头任意单个字符结尾的文件
/etc/passwd

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

[root@myEcs tmp]# ls -d /etc/pa[a-z]*                     //匹配以pa开头中间包含a-z任意单个字符的文件。
/etc/pam.d  /etc/papersize  /etc/passwd  /etc/passwd-  

有几种特殊格式:

      [a-z]:匹配a-z任意单个字符 

      [A-Z]:匹配A-Z任意单个字符

      [a-z0-9]:匹配a-z或0-9任意单个字符

      [abcxyz]:匹配abcxyz任意单个字符

      [[:upper:]]:所有大写字母

[root@myEcs tmp]# ls [[:upper:]][[:upper:]][[:upper:]]   //列出三个都是大写的任意字母的目录
ABC:

DEF:

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

[root@myEcs tmp]# ls [[:lower:]][[:lower:]][[:lower:]]   //列出三个都是小写的任意的字母的目录
abc:

def:  

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

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

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

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

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

 

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

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

      [^[:lower:]]:匹配除了小写字母以外的任意单个字符

      [^[:digit:]]:匹配除了数字以外的任意单个字符

练习:

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

[root@myEcs ~]# ls -d /var/l?[[:lower:]]
/var/lib  /var/log

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

[root@myEcs ~]# ls  /etc/[[:digit:]]*[^[:digit:]]
/etc/3abc

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

[root@myEcs ~]# ls -d /etc/[^a-z][a-z]*
/etc/3abc  

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

[root@myEcs ~]# mkdir /tmp/test.com && cp -r /etc/m*[^1-9] /tmp/test.com
[root@myEcs ~]# ls /tmp/test.com/
machine-id  mail.rc                   mapi         modprobe.d      mtab
magic       makedumpfile.conf.sample  mime.types   modules-load.d  my.cnf
mailcap     man_db.conf               mke2fs.conf  motd            my.cnf.d

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

[root@myEcs ~]# mkdir /tmp/man && cp -r /usr/share/man/man[1-9] /tmp/man
[root@myEcs ~]# ls /tmp/man/
man1  man2  man3  man4  man5  man6  man7  man8  man9

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

[root@myEcs ~]# mkdir /tmp/conf.d && cp -r /etc/[mnrp]*.conf /tmp/conf.d
[root@myEcs ~]# ls /tmp/conf.d/
man_db.conf    nscd.conf      pear.conf     request-key.conf
mke2fs.conf    nsswitch.conf  php-fpm.conf  resolv.conf
nfs.conf       ntp.conf       pool.conf     rsyncd.conf
nfsmount.conf  numad.conf     radvd.conf    rsyslog.conf

IO重定向及管道

      可用于输入的设备:文件,键盘设备,文件系统上的常规文件,网卡等。

      可用于输出的设备:文件,显示器,文件系统上的常规文件,网卡等。  

      程序的数据流有三种:

              输入的数据流:<-- 标准输入(stdin)键盘。

              输出的数据流:--> 标准输出(stdout)显示器

              错误输出流:   --> 错误输出(stderr)显示器

      问价描述符:fd

             标准输入:0

             标准输出:1

             错误输出:2

IO重定向

            输出重定向:> 

                  特性:覆盖输出

            输出重定向:>>

                  特性:文件尾部追加

特殊设备:/dev/null

            

set -C:禁止覆盖输出重定向以及存在的文件。

[root@myEcs tmp]# set -C
[root@myEcs tmp]# echo "huangxiaojun" > a.txt 
-bash: a.txt: 无法覆盖已存在的文件  

强制覆盖输出:加一个|

[root@myEcs tmp]# echo "huangxiaojun" >| a.txt 
[root@myEcs tmp]#   

set +C:关闭禁止覆盖输出重定向。

[root@myEcs tmp]# set +C 
[root@myEcs tmp]# echo "黄晓君" > a.txt 
[root@myEcs tmp]#   

错误输出流重定向:2> , 2>>

cat: /etc/passwd1: 没有那个文件或目录
[root@myEcs tmp]# cat /etc/passwd1 2> /tmp/b.txt    //将错误输出信息重定向到指定文件
[root@myEcs tmp]#   

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

方式1:&>  &>>

[root@myEcs tmp]# cat /etc/passwd1 2> /tmp/b.txt
[root@myEcs tmp]# cat /etc/passwd &> /tmp/b.txt        // 不管是错误输出或者是正确输出,都重定向到一个文件中去
[root@myEcs tmp]# cat /etc/passwd1 &> /tmp/b.txt
[root@myEcs tmp]# cat /tmp/b.txt 
cat: /etc/passwd1: 没有那个文件或目录

方式2:COMMAND > /path/to/file 2>&1 

           COMMAND > /path/to/file 2>&1

[root@myEcs tmp]# cat /etc/passwd > /tmp/a.txt 2>&1
[root@myEcs tmp]# cat /etc/passwd1 > /tmp/a.txt 2>&1
[root@myEcs tmp]# tail -10 /tmp/a.txt 
cat: /etc/passwd1: 没有那个文件或目录

 

输入重定向:<

[root@myEcs ~]# cat < /etc/passwd 

tr [OPTIN]...SET1 [SET2]

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

[root@myEcs ~]# tr [a-z] [A-Z] < /etc/issue    //将内容转换成大写显示到屏幕
\S
KERNEL \R ON AN \M

-d:指定删除指定的字符。不会修改源文件

[root@myEcs ~]# tr -d [a-z] < /etc/issue
\S
K \   \

[root@myEcs ~]# 

<< :此处创建文档。 

[root@myEcs tmp]# cat > /tmp/a.txt << END
> hello world
> How are you?
> what are you doing?
> END
[root@myEcs tmp]# cat /tmp/a.txt 
hello world
How are you?
what are you doing?
[root@myEcs tmp]# 

管道:|把前一个命令的输出当成另一个命令的输入数据流,连接程序

     command1 | command2 | command|...

[root@myEcs tmp]# cat /etc/passwd|tr "a-z" "A-Z"
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
SHUTDOWN:X:6:0:SHUTDOWN:/SBIN:/SBIN/SHUTDOWN
...

tee :前一次数据流发送给tee,tee后面指定文件保存当前数据流,再将这个数据流转发给后面的命令。tee命令经常和管道一起使用

[root@myEcs tmp]# cat /etc/issue|tee /tmp/issue.txt | tr 'a-z' 'A-Z'
\S
KERNEL \R ON AN \M

[root@myEcs tmp]# cat /tmp/issue.txt 
\S
Kernel \r on an \m

[root@myEcs tmp]# 

       

 



posted @ 2020-04-09 22:56  附庸风雅  阅读(163)  评论(0)    收藏  举报