(一)bash的基础特性
- globbing:文件名通配
- *:匹配零或零个以上的任意字符
- ?:匹配任意的单个字符,不可以为零个
- []:匹配指定范围内的任意单个字符,有几种特殊格式
- [a-z]/[A-Z]:任意一个字母,注意不区分大小写,p[a-z]a,外面的p和a区分大小写,里面的a-z不区分
- [[:upper:]]:匹配一个大写字母,外层的中括号是通配符,里面的所有的表示一个范围
- [[:lower:]]:匹配一个小写字母
- [[:alpha:]]:匹配一个字母
- [[:digit:]]:匹配一个数字
- [[:alnum:]]:匹配一个字母或数字,等于[[:alpha:][:digit:]]
- [[:space:]]:匹配一个空白字符
- [[:punct:]]:匹配一个标点符号
- [0-9]:任意一个数字
- [a-z0-9]:任意一个字母或者数字
- [abcxyz]:从六个字母中匹配一个
- [^]:匹配指定范围外的任意单个字符
- [^[:upper:]]:非大写字母
- [^0-9]:非数字
(二)IO重定向及管道
- 可用于输入的设备(一切皆文件)
- 键盘,文件系统上的常规文件,网卡
- 可用于输出的设备(一切皆文件)
- 显示器,文件系统上的常规文件,网卡
- 程序的数据流有三种
- 输入的数据流:<--标准输入(stdin)是键盘
- 输出的数据流:-->标准输出(stdout)是显示器
- 错误输出流: -->错误输出(stderr)是显示器
- fd:file descriptor/文件描述符/Windows中叫做文件句柄
- 标准输入:0
- 标准输出:1
- 错误输出:2
- IO重定向
- 输出重定向:>
- 例如:cat /etc/issue > /tmp/issue.out;
- 再例如:cat /etc/issue > /dev/tty1
- 这样写很危险:cat /etc/issue > /dev/sda
- 属于覆盖输出重定向。如果使用>>就是追加输出重定向
- set -C:
- 禁止覆盖输出重定向至已存在的文件。
- 可以使用“>|”强制覆盖重定向
- 仅对当前shell进程有效
- set +C取消限制
- 错误输出重定向:2>
- 例如:cat /etc/issue1 2> /tmp/issue.err
- 覆盖输出,2>>是追加输出
- 合并正常输出流和错误输出流:&>
- 覆盖输出,&>>是追加输出
- 还有一种写法:cat /etc/issue >> /tmp/issue.out 2>&1
- 特殊设备:/dev/null
- 数据黑洞
- 例如:head -1 /etc/passwd &> /dev/null;echo $?。就是想看看这个文件有没有第一行,不关心结果,只关心命令执行状态结果。
- 输入重定向:<
- <<后面加结束符,表示输入结束。
- 例如:cat > /tmp/cat.out << EOF
- <<后面加结束符,表示输入结束。
- 介绍一个tr命令
- tr [OPTION]...SET1[SET2]
- 把输入的数据当中的字符,凡是在SET1定义范围内出现的,统统对位转换为SET2中出现的字符。如果加-d,则不需要SET2,此时会把和SET1匹配的删除。
- 例如:tr abc ABC
- 该命令只能从标准输入读取输入,如果后面跟文件会出错
- 所以可以使用输入重定向:tr abc ABC < /etc/issue。注意,不会修改源文件,只是将结果输出到屏幕中。
- 输出重定向:>
- 管道
- 连接程序,实现将前一个命令的输出直接定向给后一个命令当作输入数据流
- 用法:COMMAND1 | COMMAND2 | COMMAND3 | 。。。
- 例如:cat /etc/issue | tr 'a-z' 'A-Z'
- 再例如:who | head -2 | tr -d '0-9'
- Linux的重要思想之一:组合小程序,完成复杂任务
- tee命令既可以将前一个命令的输出保存或者输出,又可以继续往后传。例如:cat /etc/issue | tee /tmp/issue.tee | tr 'a-z' 'A-Z'
练习1:把/etc/passwd文件的前6行的信息转换为大写字母后输出
答案:head -n 6 /etc/passwd | tr 'a-z' 'A-Z'
新命令总结:tr,tee