您的位置:首页 > 其它

glob及IO重定向

2016-11-04 13:41 197 查看
回顾:
bash基础特性:
命令补全,路径补全,命令引用,文件或目录的复制,移动,删除,
变量:变量的类型
存储格式,数据范围,参与运算

bash的基础特性:

globbing:文件名通配(整体文件名匹配,而非部分),
一定注意这个通配是文件名的通配,所以查看的时候,是写/路径/通配的文件名
匹配模式:
元字符:
*: 匹配任意长度的任意字符
pa*
pa, paa, passwd
匹配文件中出现pa字符:*pa*
匹配以pa结尾: *pa
匹配文件名有p或a: *p*a* //但是这种方式只能匹配p在a 之 前的
?: 匹配任意单个字符
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-z或A-Z, 是一个固定格式,外面的[]则表示范围)
[[:lower:]]: 所有小写字母
[[:alpha:]]: 所有字母
[[:digit:]]: 所有数字
[[:alnum:]]: 所有字母和数字
[[:space:]]: 所有的空白字符
[[:punct:]]: 所有标点符号
举例:
[abcxyz]: 表示从abcxyz这6个字母中间匹配一个字符,且只能匹配一个
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



是一个标准的输出,我们要退出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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IO 重定向 glob