Linux入门真经-016glob通配符与IO重定向

本节继续为大家介绍bash的一些特性。

1、通配符

有时候我们在使用bash命令行的过程中,输出的内容会显得过多,这个时候我们就可以通过通配符来过滤输出。有时候你记不清文件名,只模糊的记得其中几个字母时,这个方法也方便你找到你想要的文件。

以下先列出常见的通配符及其作用,并举例演示:

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

?:匹配任意单个字符

[xxx]:匹配指定范围内的任意单个字符,有几种特殊格式:

         [a-z],[A-Z], [0-9], [a-z0-9]

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

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

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

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

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

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

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

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

         [^[:upper:]]:非大写字符

         [^0-9]:非数字

         [^[:alnum:]]:非字母

有人问我系统中在哪里可以看到关于通配符的介绍或者帮助手册,其实,man bash中就有,只是对英语不太好的朋友可能不太友好哈。

接下来我们举例,来帮助你更好地理解这些通配符的含义:

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

[root@localhost ~]# ls -d /var/l*[[:lower:]]

/var/lib /var/local  /var/lock  /var/log

[root@localhost ~]#

显示/dev目录下,以数字结尾的,文件名共四个字符的文件或目录

[root@localhost ~]# ls -d /dev/???[0-9]

/dev/dm-0 /dev/sda1  /dev/tty1  /dev/tty4 /dev/tty7  /dev/vcs1  /dev/vcs4

/dev/dm-1 /dev/sda2  /dev/tty2  /dev/tty5 /dev/tty8  /dev/vcs2  /dev/vcs5

/dev/rtc0 /dev/tty0  /dev/tty3  /dev/tty6 /dev/tty9  /dev/vcs3  /dev/vcs6

[root@localhost ~]#

复制/var/log目录下所有文件名中出现2018的文件至/tmp/2018log目录下

[root@localhost log]# mkdir /tmp/2018log

[root@localhost log]# cp /var/log/*2018*/tmp/2018log/

[root@localhost log]# ls -d /tmp/2018log/*

/tmp/2018log/boot.log-20180806  /tmp/2018log/messages-20180806

/tmp/2018log/btmp-20180806      /tmp/2018log/secure-20180806

/tmp/2018log/cron-20180806      /tmp/2018log/spooler-20180806

/tmp/2018log/maillog-20180806

[root@localhost log]#

显示/dev/目录下非数字结尾,且文件名中出现了标点符号的文佳

[root@localhost log]# ls -d /dev/*[[:punct:]]*[^0-9]

/dev/btrfs-control    /dev/loop-control     /dev/network_throughput  /dev/vhost-net

/dev/cpu_dma_latency  /dev/network_latency  /dev/vga_arbite

2、IO重定向

IO,指的是输入(Input)与输出(output)

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

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

程序中的数据流大致又可以分为三种:

输入的数据流;<-- 标准输入(stdin),键盘;

正常输出数据流:--> 标准输出(stdout),显示器;

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

我们可以把本应该输出到显示器的内容改输出到文件中,或者可以不从键盘输入而从文件读取内容输入,这都是重定向的一种。

每当进程打开或者创建一个文件产生IO数据流的时候,内核会对进程返回一个整数,我们称之为文件描述符,他们分别为:

标准输入:0

标准输出:1

错误输出:2

那么如何进行IO重定向呢,我们下面先讲方法,再举例帮助你理解

输出重定向:>

特性:覆盖输出(原来文件中的数据将被覆盖)

输出重定向:>>

特性:追加输出

由于覆盖输出具有危险性,因此可以使用以下功能提升安全性

# set -C

禁止覆盖输出重定向至已存在的文件;

此时可使用强制覆盖输出:>|

关闭上述特性

# set +C     

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

合并正常输出流和错误输出流至某文件:

(1) &>, &>>

(2) COMMAND > /path/to/somefile 2>&1

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

输入重定向:

命令也可以从文件获取输入:COMMAND < file

也可以从标准输入获取输入(EOF为自定义的结束符):COMMAND< EOF

此处顺便介绍一个特殊的设备:/dev/null

这是个黑洞设备,所有的数据重定向到/dev/null中都会直接被丢弃,烟消云散。

以下为举例与练习,帮助读者理解:

首先创建用于测试的文佳file1、file2、file3。

[root@localhost ~]# touch /tmp/file{1..3}

将标准输出重定向到file1,查看file1内容。

[root@localhost ~]# cat /etc/fstab > /tmp/file1

[root@localhost ~]# cat /tmp/file1

#

# /etc/fstab

# Created by anaconda on Tue Jul 2418:32:49 2018

#

# Accessible filesystems, by reference, aremaintained under '/dev/disk'

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

#

/dev/mapper/centos-root /                       xfs     defaults        0 0

UUID=d36d93ea-2551-4c6a-a3c9-df98d458b5bc/boot                   xfs     defaults        0 0

/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@localhost ~]#

测试追加重定向(新增加的行我用红体字标明了):

[root@localhost ~]# echo "this is anew line" >> /tmp/file1

[root@localhost ~]# cat /tmp/file1

#

# /etc/fstab

# Created by anaconda on Tue Jul 2418:32:49 2018

#

# Accessible filesystems, by reference, aremaintained under '/dev/disk'

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

#

/dev/mapper/centos-root /                       xfs     defaults        0 0

UUID=d36d93ea-2551-4c6a-a3c9-df98d458b5bc/boot                   xfs     defaults        0 0

/dev/mapper/centos-swap swap                    swap    defaults        0 0

this is a new line

覆盖重定向会覆盖文件的原本内容,为提高安全性,可以使用set -C禁止对已存在的文件进行覆盖重定向:

[root@localhost ~]# echo "this isanother new line" > /tmp/file1

[root@localhost ~]# cat /tmp/file1

this is another new line

[root@localhost ~]# set -C

[root@localhost ~]# echo "this isanother new line" > /tmp/file1

-bash: /tmp/file1: cannot overwriteexisting file

[root@localhost ~]#

将错误输出流重定向至file2

[root@localhost ~]# set +C

[root@localhost ~]# ls /nosuchfile 2> /tmp/file2

[root@localhost ~]# cat /tmp/file2

ls: cannot access /nosuchfile: No such fileor directory

[root@localhost ~]#

错误输出追加重定向:

[root@localhost ~]# ls /nosuchfile 2>> /tmp/file2

[root@localhost ~]# cat /tmp/file2

ls: cannot access /nosuchfile: No such fileor directory

ls: cannot access /nosuchfile: No such fileor directory

[root@localhost ~]#

合并正常输出流和错误输出流至某文件:

ll anaconda-ks.cfg nosuchfile &> /tmp/file3会产生一条标准输出一条错误输出。合并重定向至/tmp/file3

[root@localhost ~]# ll anaconda-ks.cfgnosuchfile &> /tmp/file3

[root@localhost ~]# cat /tmp/file3

ls: cannot access nosuchfile: No such fileor directory

-rw-------. 1 root root 1424 Jul 24 18:48anaconda-ks.cfg

[root@localhost ~]#

输入重定向:

[root@localhost tmp]# cat << EOF

> hello

> EOF

hello

[root@localhost tmp]# head -5 </etc/passwd

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

注:可能你会觉得输入重定向的用法比较怪异,不用感到迷惑,学到更多的字符处理命令和bash脚本编程时你就会领悟他的用处。

关注本公众号获取每日更新

猜你喜欢

转载自blog.csdn.net/syaziou/article/details/81836151