热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bash的基本特性之文件名通配及IO重定向,管道详解

本篇博文依然涉及到bash的基本特性文件名通配,并讲解IO重定向以及管道的使用管道配合tr命令的应用bash的基础特性之一:文件名通配globbing:文件名通配(整体文件名匹配,

本篇博文依然涉及到bash的基本特性 文件名通配,并讲解IO重定向以及管道的使用 管道配合tr命令的应用


bash的基础特性之一:文件名通配

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

   匹配模式:元字符

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

pa*,*pa*,*pa,*p*a*

?:匹配任意单个字符

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

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

有几种特殊字符:

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

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

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

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

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

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

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

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

[[:space:]]:空格

 pa[0-9][0-9],2[0-9][0-9]

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

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

[^[:space:]]:空白字符外

[^[:alnum:]]:所有的字母和数字外

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

root@wen-7 shell]# ls -d  /var/1?[[:lower:]]
/var/1aa

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

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

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

[root@wen-7 shell]# ls  -d /etc/[^a-z][a-z]*
/etc/2afd1  /etc/2qq
[root@wen-7 shell]#

4. 复制/etc/目录下,所有以m开头,以非数字结尾的文件后目录至/tmp/magedu.com目录

[root@wen-7 shell]# cp -r  /etc/m*[^0-9] /tmp/magedu.com/
[root@wen-7 shell]# ls /tmp/magedu.com/
machine-id  mail.rc                   maven        modprobe.d      mtab         my.cnf
magic       makedumpfile.conf.sample  mime.types   modules-load.d  mtools.conf  my.cnf.d
/

5.  复制/usr/share/man目录下,所有以m开头,后根一个数字结尾的文件后目录至/tmp/man目录下

[root@wen-7 shell]# cp -r /usr/share/man/m*[0-9] /tmp/man
[root@wen-7 shell]# ls /tmp/man
man1  man2  man3  man4  man5  man6  man7  man8  man9

6. 复制/etc/目录下,所有以.conf开头,且以m,n,r,p开头的文件后目录至/tmp/conf.d

[root@wen-7 shell]# cp -r /etc/[mnrp]*.conf /tmp/conf.d/
[root@wen-7 shell]# ls /tmp/conf.d/
man_db.conf  named.conf     ntp.conf      pcp.conf      request-key.conf  rsyslog.conf
mke2fs.conf  nfsmount.conf  numad.conf    pnm2ppa.conf  resolv.conf

IO重定向及管道:

程序:指令+数据

程序:IO 

    可用于输入的设备:文件(键盘设备,文件系统上的文件,网卡等)

    可用于输出的设备:文件(显示器,文件系统上的文件,网卡等)

程序的数据流有三种:

    输入的数据流:<------标准输入(stdin),默认输入是键盘;

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

    错误输出流:-------->标准输出(stderr),默认是显示器;

fd:file descriptor:文件描述符

文件在打开后,在内核中反复调用文件

系统在每一个文件加载完成后,用唯一一个数字来标识文件,这个数字叫做fd

    标准输入:0

    标准输出:1

    错误输出:2


IO重定向:把标准输入输出改变位置

输出重定向: >       

        特性:覆盖输出   注意:不要对硬盘设备/dev/sd* 重定向 会清空磁盘

        使用 set -c命令, 禁用覆盖输出重定向至已存在的文件; 此时可使用强制覆盖输出:>|

            只对当前shell 有效    

        使用 set +c命令, 启用覆盖重定向功能

输出重定向: >>

        特性:追加输出 原有的内容后面追加  建议使用

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

[root@wen-7 shell]# cat /etc/issueq 2> /tmp/issosut.out 
[root@wen-7 shell]# cat /tmp/issosut.out 
cat: /etc/issueq: 没有那个文件或目录
[root@wen-7 shell]# cat /etc/issueq 2>> /tmp/issosut.out 
[root@wen-7 shell]# cat /tmp/issosut.out 
cat: /etc/issueq: 没有那个文件或目录
cat: /etc/issueq: 没有那个文件或目录

合并多个程序的输出:

    (COMMAND1;COMMAND2) > /POTH/TO/SOMEFILE

[root@wen-7 shell]# (cat /etc/issue;cat /etc/redhat-release ) > /tmp/iss
issosut.out  issue.out    
[root@wen-7 shell]# (cat /etc/issue;cat /etc/redhat-release ) > /tmp/issosut.out 
[root@wen-7 shell]# cat /tmp/issosut.out 
#\S
#Kernel \r on an \m
#$hostname
#date
CentOS Linux release 7.2.1511 (Core)

    

合并正常输出流和错误输出流:

1.&> ,&>>   不管命令正确或失败

[root@wen-7 shell]# cat /etc/issue &>> /tmp/issosut.out 
[root@wen-7 shell]# cat /tmp/issosut.out 
#\S
#Kernel \r on an \m
#$hostname
#date
cat: /etc/issueq: 没有那个文件或目录
cat: /etc/issueq: 没有那个文件或目录
#\S
#Kernel \r on an \m
#$hostname
#date

2.2&>1

[root@wen-7 shell]# cat /etc/issueq >> /tmp/issosut.out 2>&1
[root@wen-7 shell]# cat /tmp/issosut.out 
#\S
#Kernel \r on an \m
#$hostname
#date
cat: /etc/issueq: 没有那个文件或目录

特殊设备:

/dev/null:空设备,可以屏蔽信息 

        可以凭借命令的执行状态结果,进行判断

[root@wen-7 shell]# head -n1 /etc/passwd &>/dev/null
[root@wen-7 shell]# echo $?0

/dev/zero:造0机,重复造0

输入重定向:<

tr命令:

    tr [options].....SET1[SEF2]

        把输入的数据中的字符,凡是在SEF1定义的范围中,通通对位转换为SEF2出现的字符

[root@wen-7 shell]# tr [a-z] [A-Z]
how are you
HOW ARE YOU
hello world
HELLO WORLD
123
123

        不接受指定位置,只能输出重定向

[root@wen-7 shell]# tr [a-z] [A-Z] < /etc/issue
#\S#KERNEL \R ON AN \M
#$HOSTNAME
#DATE

    用法:tr sef1 sef2  

                tr  [options] sef1 < /PATH/TO/SOMEFILE

 选项:

        -d:删除指定字符集合中的字符

        -s: 把连续重复的字符以单独一个字符表示

        -t:将第一个字符集对应字符转化为第二字符集对应的字符


输入重定向:<<

    here Document:

        cat  <

        cat > / PATH/TO/SOMEFILE  <

        输出创建文件:

[root@wen-7 shell]# cat > /tmp/cat.sh << EOF
> how are you
> what are you doing
> END
> EOF
[root@wen-7 shell]# cat /tmp/cat.sh 
how are you
what are you doing
END

           脚本打印列表:

[root@wen-7 shell]# cat s.sh 
#!/bin/bash
cat << EOF
hello world
hello wen
hello user
EOF

管道:

使用符号“|“表示

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

    COMMAND1 | COMMCND2 | COMMAND3.。。。

[root@wen-7 shell]# cat /etc/issue | tr [a-z] [A-Z]
#\S
#KERNEL \R ON AN \M
#$HOSTNAME
#DATE
[root@wen-7 shell]# who| head -2| cut  -d" " -f1
root
root

   错误输出默认不能通过管道转发,可利用2>&1| 或|&实现     

[root@wen-7 shell]# ca /tmp/issosut.out |& tr ‘a-z‘ "A-Z" 
BASH: CA: 未找到命令...
相似命令是::
‘AC‘
‘SA‘
[root@wen-7 shell]# ca /tmp/issosut.out 2>&1| tr ‘a-z‘ "A-Z" 
BASH: CA: 未找到命令...
相似命令是::
‘AC‘
‘SA‘

扩展用法:

   1.less:一页一页查看

        $ls -l /etc|less

   2.通过电子邮件发送输入

        $echo "test mail"|mail \

            -s "test" root@example.com

    3.lpr:把输入发送给打印机

            $echo "test print" | lpr -P printer_name

tee命令:

保留命令的输出结果保留到文件中,并把结果在输出到屏幕上

使用:

    保存不同阶段的输出

    复杂管道的故障排除

    同事查看和记录输出

[root@wen-7 shell]# cat /etc/issue | tee /tmp/issue.out 
#\S
#Kernel \r on an \m
#$hostname
#date
[root@wen-7 shell]# cat /tmp/issue.out 
#\S
#Kernel \r on an \m
#$hostname
#date

并能再递到后面的命令

[root@wen-7 shell]# cat /etc/issue | tee /tmp/issue.out 
#\S
#Kernel \r on an \m
#$hostname
#date
[root@wen-7 shell]# cat /tmp/issue.out 
#\S
#Kernel \r on an \m
#$hostname
#date

练习:

    1.把/etc/passwd/文件中的前6行的信息转换成大写输出到屏幕上

[root@wen-7 shell]# head -n6 /etc/passwd | tr ‘a-z‘ ‘A-Z‘
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC

链接文件的区别:

软链接文件中,链接文件保存的只是源文件的文件名和文件路径,用户访问链接文件,实则跳转至源文件,相当于windows的快捷方式

硬链接文件中,链接文件保存的是源文件的所有数据,相当于源文件的备份

inode的工作原理:

用 户创建一个文件,系统会自动分配一个inode号,inode号是文件系统下的inode表的编号,每个inode号对应的记录中包含文件的元数据和数据指向关系,系统会在文件创建时,依据文件的大小自动选择指针类型,来在inode表中指明数据块地址,文件大小小于4k,选择直接块指针,大于4k选择,并是1024的倍数,系统会自动使用间接块指针,双重间接块指针,三层间接块指针,每一层多出4*1024*1024的大小

练习:

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

[[root@wen-7 ~]# tr [a-z] [A-Z] < /etc/issue > /tmp/issue.out 
[root@wen-7 ~]# cat /tmp/issue.out 
#\S
#KERNEL \R ON AN \M
#$HOSTNAME
#DATE

2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中

[root@wen-7 ~]# echo `who` | tr [a-z] [A-Z] > /tmp/who.out 
[root@wen-7 ~]# cat /tmp/who.out 
ROOT PTS/0 2016-07-28 08:19 (10.1.250.47) ROOT PTS/1 2016-07-28 17:54 (10.1.250.47)
[root@wen-7 ~]#

3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:

Hello, I am 用户名,the system version is here,pleasehelp me to check it ,thanks!

操作系统版本信息

[wen@wen-7 ~]$ echo “Hello, I am $HOSTNAME ,the system bersion is here,pleasehelp me tanks! `cat /etc/redhat-release` | 
> mail -s help root
Message 14:
From wen@wen-7.localdomain  Thu Jul 28 20:54:15 2016
Return-Path: 
X-Original-To: root
Delivered-To: root@wen-7.localdomain
Date: Thu, 28 Jul 2016 20:54:15 +0800
To: root@wen-7.localdomain
Subject: help
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=utf-8
From: wen@wen-7.localdomain (wen)
Status: R
“Hello, I am wen-7 ,the system bersion is here,pleasehelp me tanks! CentOS Linux release 7.2.1511 (Core)

4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开

[root@wen-7 ~]# ls /root/ | tr "\n" "\040"
passwd.bak qwe.file qwe.txt shell 上课网络环境.txt [root@wen-7 ~]# 
[wen@wen-7 ~]$ ls /root/ | tr "\n" "\040"

5、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和

[root@wen-7 ~]# i=$((`tr " " "+" < file1`));echo $i
55
[root@wen-7 ~]# cat file1 
1 2 3 4 5 6 7 8 9 10

6、删除Windows文本文件中的‘^M‘字符

[root@wen-7 ~]# cat -A 上课网络环境.txt | tr ‘^M’ "\015"
$
$

7、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格

[root@wen-7 ~]# echo "xt.,l 1 jr#$summn2 c*/fe3 uz4" | tr "a-z" " "| tr "[[:punct:]]" " "
      1          3   4

8、将PATH变量每个目录显示在独立的一行

[root@wen-7 ~]# echo $PATH| tr ":" "\n"
/usr/lib64/qt-3.3/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

9、删除指定文件的空行

[root@wen-7 shell]# cat filist.sh 
#!/bin/bash
echo "通过命令传递两个文本,计算空白行之和"
[ $# -lt 2 ] && echo "2 ge canshu" && exit 1
fuo1=$(grep "^$" $1|wc -l)
fun2=$(grep "^$" $2|wc -l)
echo "tolal blank lins: $[$fun1+$fun2]"
[root@wen-7 shell]# cat filist.sh | tr -s "\n"
#!/bin/bash
echo "通过命令传递两个文本,计算空白行之和"
[ $# -lt 2 ] && echo "2 ge canshu" && exit 1
fuo1=$(grep "^$" $1|wc -l)
fun2=$(grep "^$" $2|wc -l)
echo "tolal blank lins: $[$fun1+$fun2]"
#tr

10、将文件中每个单词(字母)显示在独立的一行,并无空行

[root@wen-7 shell]# cat filist.sh | tr -s "\040" "\n"
#!/bin/bash
echo
"通过命令传递两个文本,计算空白行之和"
[
$#
-lt
2
]
&&
echo
"2
ge
canshu"
&&
exit
1


               


本文出自 “linux系统” 博客,谢绝转载!

bash的基本特性之文件名通配 及IO重定向,管道详解


推荐阅读
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
我只爱庄宝贝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有