linux watch 重定向,08.glob通配及IO重定向.md

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

匹配模式:元字符

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

pa,pa,*pa,pa

?:匹配任意单个字符

pa?,??pa,p?a,p?a?

#匹配pa开头

ls /etc/pa*

#指定-d:代表不显示匹配文件夹下的文件

ls -d /etc/pa*

#匹配pa后4个字符

ls -d /etc/pa????

#匹配。log结尾

ls /var/log/*.log

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

有几种特殊格式:

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

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

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

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

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

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

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

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

#匹配p和a之间有标点符号的文件

lsp[[:punct:]]a

#创建一个中间有空白字符的文件

touchp\a

#匹配中间有空白字符的文件

ls ?[[:space:]]?

[^[:upper:]] 匹配非大写字母

[^[0-9]] 匹配非数字

[^[:alnum:]] 匹配非正常字符

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

ls -d /var/l?[[:lower:]]

练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录

ls -d /etc/[0-9]*[^0-9]

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

touch /etc/1Ac /etc/2b777

ls -d /etc/[^a-z][a-z]*

ls -d /etc/[^[:alpha:]][[:alpha:]]*

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

mkdir /tmp/abc.com

cp -r /etc/m*[^0-9] /tmp/abc.com

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

mkdir /tmp/man

cp -r /usr/share/man/man[0-9] /tmp/man

#查看复制过去的文件占的硬盘空间

du -sh /tmp/man

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

mkdir /tmp/conf.d

cp -r /etc/[mnrp]*.conf /tmp/conf.d

IO重定向及管道

可用于输入的设备:文件

键盘设备、文件系统上的常规文件、网卡等

可用于输出的设备:文件

显示器、文件系统上的常规文件、网卡等

程序的数据流有三种:

输入的数据流:

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

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

fd:file descriptor,文件描述符

标准输入:0

标准输出:1

错误输出:2

IO重定向:

输出重定向:

覆盖输出 >

追加输出 >>

cat /etc/issue > /tmp/issue.out

输出重定向到虚拟终端tty2上:

cat /etc/issue > /dev/tty2

虚拟终端tty2的显示:

03e224093cc227592144e90bffc8b94d.png

set -C

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

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

1b64d7060945015bf423a215629a6e35.png

强制覆盖输出

cat /etc/issue >| /tmp/issue.out

set +C

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

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

以下不存在的文件或目录的错误信息输出到了/tmp/abc.out文件中

cf4c9b262b0917697499f0e1c824e761.png

合并正常输出流和错误输出流:&>,&>>

#正常输出流

cat /etc/issue &>> /tmp/abc.out

#错误输出流

cat /etc/issue1 &>> /tmp/abc.out

合并正常输出流和错误输出流另一种方式:

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

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

#正常输出流

cat /etc/issue >> /tmp/issue5.out 2>&1

#错误输出流

cat /etc/issue5 >> /tmp/issue5.out 2>&1

输入重定向 <

tr [OPTION]... SET1 [SET2]

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

用法1:

tr SET1 SET2 < /PATH/FROM/SOMEFILE

#将输入/etc/issue文件内容所有小写字母转换为大写字母,并输入重定向到显示器

tr [a-z] [A-Z] < /etc/issue

用法2:

tr -d SET1 < PATH/FORM/SOMEFILE

#这里-d指的是删除;这里是指删除所有大写字母,并输入重定向到显示器

tr -d '[A-Z]' < /etc/issue

注意:tr命令不删除原文件

Here Document:<<

cat << EOF

cat <

> abc

> cde

> jge

> EOF

cat > /PATH/TO/SOMEFILE << EOF

#输入重定向到文件test1.out,且使用cat将文件信息打印到显示器

cat > /tmp/test1.out <

> abc

> cde

> OF

使用tee也可以做到上面的效果(tee:从标准输入写往文件和标准输出)

tee /tmp/test2.out <

> hello

> world

> EOF

管道

连接程序,实现前一个命令的输出直接定向后一个程序当做输入

COMMAND1 | COMMAND2 |COMMAND3 | ...

#cat /etc/issue的输出结果作为tr 'a-z' 'A-Z'的输入

cat /etc/issue|tr 'a-z' 'A-Z'

#只看登录的前2个用户

who|head -2

#只看登录的前2个用户,且将所有的小写字母转换为大写

who|head -2|tr 'a-z' 'A-Z'

#接上条命令,加入删除0-9数字

who|head -2|tr 'a-z' 'A-Z'|tr -d '0-9'

tee命令:将COMMAND结果输出到屏幕上,同时保存到文件中

COMMAND|tee /PATH/TO/SOMEFILE

#将/etc/issue输出结果送给tee,让tee保存到issue.tee文件里,同时会再发一次数据流给tr

cat /etc/issue|tee /tmp/issue.tee|tr 'a-z' 'A-Z'

#如果想保存文件中,又打印到显示器

cat /etc/issue|tee /tmp/issue.tee

练习1:把/etc/passwd文件的前6行的信息转换为大写字符后输出;

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

特殊设备:/dev/null

将来如果有些输出数据没有任何意义时,都可以输出重定向至/dev/null

#假设我只关心命令成功和失败,不关心输出是什么的时候,使用合并重定向到/dev/null

#在shell编程中经常用这种方式来获取它的状态,来判断是否继续执行某段程序代码.0:代表成功、1-255:代表失败

ls /var &> /dev/null

#0代表成功

echo $?

ls /varr &> /dev/null

#1-255代表失败

echo $?

cat <

两个都是获取stdin,并在EOF处结束stdin,输出stdout。

但是<

先来看man中的说明:

If the redirection operator is <

翻译过来的意思就是:如果重定向的操作符是<

这可以解决由于脚本中的自然缩进产生的制表符。

通俗一点的解释:

在我们使用cat <

比如,下面的语句就不会出错:

cat <

Hello,world!

EOF

如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。

而<

cat <

Hello,world!

EOF

上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。

这就是<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值