本节继续为大家介绍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脚本编程时你就会领悟他的用处。