路漫漫其修远兮
吾将上下而求索

linux文件通配和管道

 1. globbing文件名通配,bash的基础特性

      a. 匹配模式:元字符

          i. *: 匹配任意长度的任意字符

              1. pa*,*pa*, *pa, *p*a*

          ii. ?: 匹配任意单个字符

              1. pa?, ??pa, p?a, p?a?

          iii. []:匹配指定范围内的任意单个字符,有几种特殊格式

              1. [a-z], [A-Z]:不区分大小写,大写也可以识别

              2. [[:upper:]]:大写字母  [[:upper:]]  = [ABCDE…]  里面的大括号代表所有的大写字母,外面的括号代表取其中的一个,即ABC..Z = [:upper:]      [^[:upper:]]  = [^ABCDE…]    

              3. [[:lower:]]:小写字母 

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

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

              6. [0-9]:0-9

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

              8. [a-z0-9]:所有字母+数字

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

              10. [[:punct:]]:所有标点符号

          iv. [^]:匹配指定范围外的任意单个字符

              1. [^[:upper:]]:大写字母以外

              2. [^0-9]:数字以外

              3. [^[:alnum:]]:所有字母和数字以外

      b. 转译:touch p\ a 创建p a目录,没有\则创建两个单独的,转译字符

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

[root@localhost ~]#ls -d /var/l?[[:lower:]]
/var/lib  /var/log

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

[root@localhost ~]#ls -d /etc/[[:digit:]]*[^0-9]
ls: cannot access /etc/[[:digit:]]*[^0-9]: No such file or directory
[root@localhost ~]#mkdir /etc/9fe
[root@localhost ~]#ls -d /etc/[[:digit:]]*[^0-9]
/etc/9fe

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

[root@localhost ~]#ls -d /etc/[[:alpha:]]d*
/etc/adjtime      /etc/kde4rc          /etc/ld.so.cache

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

[root@localhost ~]#ls -d /etc/m*[^[:digit:]]
/etc/magic    /etc/makedev.d   /etc/mime.types   /etc/motd         /etc/my.cnf
/etc/mailcap  /etc/man.config  /etc/mke2fs.conf  /etc/mtab
/etc/mail.rc  /etc/maven       /etc/modprobe.d   /etc/mtools.conf
[root@localhost ~]#cp -r /etc/m*[^[:digit:]] /tmp/andy

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

[root@localhost ~]#ls -d /usr/share/man/man[0-9]
/usr/share/man/man1  /usr/share/man/man4  /usr/share/man/man7
/usr/share/man/man2  /usr/share/man/man5  /usr/share/man/man8
/usr/share/man/man3  /usr/share/man/man6  /usr/share/man/man9
[root@localhost ~]#ls -d /usr/share/man/man[4-6]
/usr/share/man/man4  /usr/share/man/man5  /usr/share/man/man6

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

[root@localhost ~]#ls -d /etc/[mnrp]*.conf
/etc/mke2fs.conf    /etc/nsswitch.conf                 /etc/pnm2ppa.conf    /etc/request-key.conf
/etc/mtools.conf    /etc/ntp.conf                      /etc/prelink.conf    /etc/resolv.conf
/etc/named.conf     /etc/pbm2ppa.conf                  /etc/readahead.conf  /etc/rsyslog.conf
/etc/nfsmount.conf  /etc/pm-utils-hd-apm-restore.conf  /etc/reader.conf

  

         iii. # set -C

              1. 禁止覆盖输出重定向至已存在的文件,但是可以追加

              2. 可使用强制覆盖输出:>|,就是即使设置:set -C,但是可以通过>| 强制覆盖

          iv. # set +C

              1. 关闭上述特性,也就是可以覆盖

          v. 示例:

[root@localhost ~]#cat test
CentOS release 6.8 (Final)
Kernel \r on an \m

[root@localhost ~]#set -C
[root@localhost ~]#echo hello > test
-bash: test: cannot overwrite existing file
[root@localhost ~]#echo hello >> test
[root@localhost ~]#cat test
CentOS release 6.8 (Final)
Kernel \r on an \m

hello
[root@localhost ~]#set +C
[root@localhost ~]#echo hello > test
[root@localhost ~]#cat test
hello

          viii. 特殊设备:/dev/null,数据黑洞

              1. 没有用的数据都可以重定向到null,重定向后不可找回数据,

              2. 有的命令只用它执行的状态结果,而不用看具体的数据流

              示例:执行echo命令后,不关心echo的内容,只关心这个命令是否执行成功,0表示成功,非0表示失败

[root@localhost ~]#echo "how are you" > /dev/null
[root@localhost ~]#echo $?
0

          ix. 输入重定向:<

          xi. : <<: Here Document  此处创建文档  

              1. cat > /PATH/FROM/SOMEFILE <<END

                  a. # cat > /tmp/cat.out <<HEHE  将当前输入的字符输出到cat.out文件中,以HEHE为结束标志,此处创建文档

          x. tr: 把输入的数据当中的字符,凡是在SET1定义范围内出现的,统统对位转换为SET2出现的字符

              1. tr [OPTION]… SET1 [SET2]

                  a. # tr [a-z] [A-Z]

                      i. how are you?  //要删除ctrl+backspace

                      ii. HOW ARE YOU?

                  b. 用法1:tr SET1 SET2 < /PATH/FROM/SOMEFILE

                      i. # tr [a-z] [A-Z] < /etc/issue 将文件输入重定向,内容的小写转换为大写

                  c. 用法2:tr -d SET1 < /PATH/FROM/SOMEFILE ,删除出现set1中的字符

                      i. # tr -d '[A-Z]' < /etc/issue  出现的大写的字符全部删除

                  d. 注意:不修改源文件

  3. 管道:连接程序,实现将当前一个命令的输出流直接定向后一个程序当输入数据流

      a. 格式:COMMAND1 | COMMAND2 | COMMAND3… 

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

      b. 组合小程序,完成复杂任务

[root@localhost ~]#cat /etc/issue
CentOS release 6.8 (Final)
Kernel \r on an \m
[root@localhost ~]#cat /etc/issue | tr 'a-z' 'A-Z'
CENTOS RELEASE 6.8 (FINAL)
KERNEL \R ON AN \M

  4. tee: 传输到管道,并且保留一份到文件 COMMAND | tee /PATH/TO/SOMEFILE

      a. # cat /etc/issue | tee /tmp/a | tr 'a-z' 'A-Z'   保存过程中的文件,并传给下一个当做参数,可以将中间执行过程日志打印出来,非常方便

[root@localhost ~]#cat /etc/issue | tee /root/test | tr 'a-z' 'A-Z'
CENTOS RELEASE 6.8 (FINAL)
KERNEL \R ON AN \M

[root@localhost ~]#cat test
CentOS release 6.8 (Final)
Kernel \r on an \m

[root@localhost ~]#cat /etc/issue | tr 'a-z' 'A-Z' | tee /root/test1
CENTOS RELEASE 6.8 (FINAL)
KERNEL \R ON AN \M

[root@localhost ~]#cat test1
CENTOS RELEASE 6.8 (FINAL)
KERNEL \R ON AN \M

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

      a. 显示正在登陆的用户,通过管道传给第二个,显示前两个用户,将用户里面的所有小写字母全部转换成大写,删除里面的所有数字

未经允许不得转载:江哥架构师笔记 » linux文件通配和管道

分享到:更多 ()

评论 抢沙发

评论前必须登录!