Linux8-bash shell的基础特性:globbing、IO重定向及管道
globbing 文件名通配(整体文件名匹配,而非部分)
匹配模式:元字符,即一个字符出现以后,它并不表示字符本身的意义,而是用来匹配一定范围内的或者制定符合条件的字符,
*:匹配任意长度的任意字符
- pa*:表示所有以pa开头的文件。此时pa不符合条件,paa符合条件
- *pa*:任意位置只要包含pa字符串就可以的文件, pa出现在任何位置都可以
- *pa: 表示以pa结尾的
- *p*a*: 表示文件名当中出现p或a,且p在a之前
?:匹配任意单个字符
- pa?: pa不符合条件,paa符合条件,passwd不符合条件
- ??pa: 以pa结尾前面可以出现任意两个字符
- p?a: p和a之间可以出现任意单个字符
- p?a?: p和a之间可以出现任意单个字符,a之后又可以出现任意单个字符
[ ]: 范围表达式,匹配指定范围内的任意单个字符,有几种特殊格式
- [a-z] / [A-Z]: 表示所有的字母,大小写都可以,因为不区分大小写
- [0-9]: 表示所有数字
- [a-z0-9]: 表示所有的字母和数字
- [abcxyz]: 从abcxyz中选一个,有且只能选一个
- pa[0-9]: pa后面跟一个数字
- pa[0-9][0-9]: pa后面出现2个数字
- 2[0-9][0-9]: 200-299之间的所有数字
ls /etc/pa* #查看etc目录下所有以pa开头的文件
ls -d /etc/pa* #查看etc目录下所有以pa开头的文件.且只显示目录
ls /etc/pa???? #pa后面只能跟上4个字符
ls -d /etc/pa???? #pa后面只能跟上4个字符
ls -d /var/log/*.log
- [[:upper:]]: 所有的大写字母,外层的中括号是指明范围的,内层的中括号整个的是一个固定格式,用来表示一个字符集合
ls [[:upper:]][0-9][0-9]a #匹配大写字母开头中间两数字结尾以a结尾的文件
- [[:lower:]]: 所有的小写字母
- [[:alpha:]]: 所有字母,不区分大小写
- [[:digit:]]: 所有数字
- [[:alpha:][:digit:]]或者 [[:alnum:]] :所有的大写字母所有字母和所有数字
- [[:space:]]:所有 空白字符
- [[:punct:]]: 所有的标点符号
ls p[[:punct:]]a
touch p\ a #\表示转义
ls ?[[:space:]]?
[^ ]: 匹配指定范围外的任意单个字符
- [^[:upper:]] :匹配所有非大写字母
- [^0-9]:匹配所有的非数字
- [^[:alnum:]]:匹配所有的非正常字符
ls p[^[:alnum:]]a
练习
1.显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录
ls -d /var/l?[[:lower:]]
2.显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录
ls -d /etc/[0-9]*[^0-9]
3.显示/etc目录下,以非字母开头,后面跟了一个字母及其他任意长度任意字符的文件或目录
ls -d /etc/[^a-z][a-z]*
4.复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录
mkdir /tmp/magedu.com
ls -d /etc/m*[^0-9]
cp -r /etc/m*[^0-9] /tmp/magedu.com
5.复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man目录下
cp -r /usr/share/man/man[0-9] /tmp/man/
6复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d目录下
cp -r /etc/[mnrp]*.conf /tmp/conf.d/
IO重定向及管道
背景介绍
程序=指令+数据, 指令通常由程序来提供,数据从哪儿来呢?程序中的数据通常来说可以有多种来源,比如在程序自己内部通过变量数组等数据结构直接提供、可以通过文件提供数据、
-程序也有IO
-IO当中,除了能够跟用户的键盘进行交互之外,也可以通过文件、网卡等来实现数据的输入输出重定向: 它本来有那么一个位置,但是把它修改到其他位置
可用于输入的设备:文件:键盘设备、文件系统上的常规文件、磁盘上的具体的文件、网卡设备
可用于输出的设备:文件:显示器、文件系统上的常规文件、网卡等
程序的数据流有三种:
【1】输入的数据流:<-- 标准输入(stdin),默认的标准输入是键盘
【2】输出的数据流:–>标准输出(staout),默认的标准输出是显示器
【3】错误输出流:–> 错误输出(stderr),显示器
shell会把一个命令的正常输出当作标准输出来对待,但是一旦命令执行失败了就输出错误输出流fd:file descriptor,文件描述符,标准输入常用数字0来表示,标准输出常用数字1来表示,错误输出常用数字2来表示
对于任何一个程序来讲,0这个文件描述符代表输入,1表示标准输出,2表示错误输出
IO重定向
输出重定向 >(要谨慎使用)
- 使用>号即可进行描述,这表示一个命令的结果不再显示到默认位置显示器上,而是改为保存到其他位置
cat /etc/issue
cat /etc/issue > /tmp/issue.out
cat /tmp/issue.out
- 特性: 覆盖输出,你所指明的原有文件中本来所有的内容会覆盖掉,而且不会打招呼的
[zhanggp@tc6000 ~]$ ls /var > /tmp/issue.out
[zhanggp@tc6000 ~]$ cat /tmp/issue.out
输出重定向 >>
- 特性:追加输出,会保留原有文件的内容,并在后面予以追加
注意:覆盖输出非常危险,为避免误操作而带来风险,可以使用set命令
set
- 设置或注销选项的值和位置参数
**-C:**禁止通过输出重定向来覆盖一个已存在的常规文件的内容,所以通过-c选项就可以把输出重定向当中的覆盖重定向的一部分功能关闭
set -C #启用功能
注意,set -C的特性仅对当前shell进程有效
cat /etc/issue > /tmp/issue.out.2cat /etc/issue > /tmp/issue.out.2
如果只想这一次覆盖呢?使用>|即可,表示强行做覆盖输出
cat /etc/issue >| /tmp/issue.out.2
如想关闭该功能使用 set +C即可
set +C
错误是另外一个输出流,它和标准输出是没有关系的,所以>或者>>仅能重定向正常输出流,,没办法定向到错误输出流
若要实现错误输出流重定向:2>,依然是覆盖输出;2>>:追加输出
cat /etc/issue1 2> /tmp/issue3.err
合并标准输出和错误输出流:
【1】&>,&>>
cat /etc/fstab &> /tmp/fstab.out
cat /etc/fstab3 &> /tmp/fstab.out
cat /etc/rc.f/int.d/functions >> /tmp/function.out 2>&1
【2】COMMAND > /path/to/somefile 2>&1(注意:前面是覆盖后面就是覆盖,前面是追加,后面就是追加)
COMMAND >> /path/to/somefile 2>&1
注意:有一个特殊设备用作输出重定向时特别好用 /dev/null,通常称为位同 bites docket,也叫数据黑洞,任何数据送给/dev/null,他都悄悄地丢弃,所以当输出数据对于我们没有任何意义时,都有可以使用输出重定向至/dev/null,
输入重定向 <;<<
- 大多数命令本身都能直接带参数,以文件当参数,所以大多数命令都不能使用输入重定向,就可以从文件中读取数据
希望cat命令不要通过键盘来,可以使用输入重定向<,
cat /etc/issue
cat < /etc/issue
但是有些命令的确不能带参数,如 tr命令,用来转换或删除字符,其默认只能从标准输入中读取命令
tr命令
tr [OPTIONS]… SET1 [SET2]#能够把输入的数据当中的字符,凡是在SET1定义的范围内出现的统统对位,即一对一地转换为SET2中出现的字符
【用法1】tr SET1 SET2 < /PATH/FROM/SOMEFILE #SET1中的字符一一替换为SET2中的字符,并打印到屏幕,并不会修改源文件
【用法2】tr -d SET1 < /PATH/FROM/SOMEFILE #删除SET1集合中出现的字符,并打印到屏幕,并不会修改源文件
tr abc ABC #表示你给的字符中如果出现了a,则全部换成A;b全部换成B;c全部换成C
attention:如下代码可用于转换序列,哈哈哈哈
tr [a-z] [A-Z]
tr [a-z] [A-Z] < /etc/issue
tr -d 'abc' < /etc/issue #删除你所指明的字符集合中的字符-d指的是delete
<<:表示此处创建文档
cat << pdd
cat > /tmp/cat.out << END #END只是一个结束符
cat /tmp/cat.out
管道
- 输入重定向和输出重定向都是把一个命令的结果保存为一个文件中或者从一个文件中读取,那么如何把一个命令的执行结果直接送给另外一个命令,即把前一个命令的输出当作后一个命令的输入,用数据流管把两者连起来,这种管道是匿名的,无需手动创建
- 也可以串n个命令
- 管道:用于连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流
COMMAND1 | COMMAND2 | COMMAND3 | …
cat /etc/issue | tr 'a-z' 'A-Z'
who | head -2
who | head -2 | tr 'a-z' 'A-Z'
who | head -2 | tr 'a-z' 'A-Z' | tr -d '0-9'
Linux的重要思想之一:组合小程序,完成复杂任务
如何将前一个命令的输出保留一份,又传递给第二个命令???使用tee命令
COMMAND1 | tee /PATH/TO/SOMEFILE | COMMAND2
tee命令能够完成两道输出,一道输入,把前一个命令的结果送给tee,让tee保留在一个文件中,同时又会再发一个数据流给后面的命令,因此tee命令经常和管道一起使用,实现将数据分方向发送
练习
1.把/etc/passwd文件前六行的信息转换为大写字符后输出
cat /etc/passwd | head -6 | tr 'a-z' 'A-Z'
head -a 6 /etc/passwd | tr 'a-z' 'A-Z'
Linux8-bash shell的基础特性:globbing、IO重定向及管道相关推荐
- shell美元符_美元符号_笨办法学Bash Shell编程-基础篇视频课程_Linux视频-51CTO学院...
聪明人下笨功夫.本课程所倡导"笨办法"的核心是: ● 手动输入所有代码,不要复制粘贴! ● 正确地输入所有代码,也包括注释 ● 运行代码并保证产生相同的输出 ● 如果出现了bug, ...
- linux 命令详解 大于号_大于号与小于号_笨办法学Bash Shell编程-基础篇视频课程_Linux视频-51CTO学院...
聪明人下笨功夫.本课程所倡导"笨办法"的核心是: ● 手动输入所有代码,不要复制粘贴! ● 正确地输入所有代码,也包括注释 ● 运行代码并保证产生相同的输出 ● 如果出现了bug, ...
- BASH SHELL 脚本基础
什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序, ...
- 基于Linux的bash/shell编程基础
目录 第一章 shell入门 1.什么是shell 2.shell入门 3,变量的定义和使用 4.接收用户输入(重点) 5.条件判断语句 6.运算符 6.1.算数运算符 6.2.关系运算符 6.3.逻 ...
- linux 导出io,Linux基础知识之IO重定向
该博文以CentOS6.8_x86_64系统为基础,Xshell 5远程连接CentOS系统,以root身份登录系统. 什么是I/O重定向? 所谓I/O重定向简单来说就是一个过程,这个过程捕捉一个文件 ...
- shell脚本基础(环境变量、重定向、数学运算、退出脚本)
一.使用环境变量 1.环境变量 所谓环境变量,就是用来存储有关shell会话和工作环境信息的特性,这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们.这也是存储持久数据 ...
- linux下的IO重定向与管道相关的知识简析
一.bash重定向部分简单翻译 1.1.bash手册关于重定向短短的注解(因为过于经典,所以摘录出来) 我的翻译要开始毁经典啦... 参考: https://blog.csdn.net/spch200 ...
- linux 重定向_Unix/Linux编程实践之IO重定向和管道
I/O重定向的原理模型 ls > test.file是如何工作的?shell是如何告诉程序把结果输出到文件,而不是屏幕? 在who | sort > user.file中,shell是如何 ...
- 文件名重定向到txt中Linux,Linux上glob用于实现文件名的通配、IO重定向及管道
Linux中所谓的通配是指,显示以指定条件为条件的文件:即通配的含义是指搜寻以已知条件为前提的目标文件. 常用文件通配符有: 文件通配符 含义 例子 * 任意长度的任意字符 如a*,搜寻所有以a为首的 ...
最新文章
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
- 高性能的JavaScript--加载和执行
- 阅读JavaScript高级程序设计(第二版)笔记
- Android 5.1 添加硬件抽象层(HAL)和JNI接口总结
- ios uiview 如何刷新_ios – 从另一个UIViewController刷新表
- 运行HelloJersey遇到异常解决方法
- thinkphp下nginx重写index.php
- 工控蜜罐 Conpot 的进阶玩法
- python中if缩进规则_Python if条件判断
- 在计算机领域中 媒体是,在计算机中,媒体是指什么
- 温度转换python代码解释_python温度转换代码
- 海马玩安卓模拟器linux,Droid4X 0.8.4 海马玩安卓模拟器 安卓的福音
- 投影仪分辨率以及对应的投影幕布比例
- TPP:你的数据你做主 TPP将撤销政府的数据主权
- 解决vender-base.66c6fc1c0b393478adf7.js:6 TypeError: Cannot read property ‘validate‘ of undefined问题
- QT 读Excel表格
- asp.net实现无刷新ajax技术登录界面
- 免Root卸载系统预装应用
- 美通社企业新闻汇总 | 2019.1.18 | 联通与中兴打通全球首个5G智能终端;碧桂园化身产城运营服务商...
- python资格证_掌握核心竞争力:五大数据科学类资格证书