glob及IO重定向

(一)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

原文地址:https://www.cnblogs.com/jacky1982/p/7622467.html