Shell(Bash)管道符用法详解
在 Bash 中,管道符使用"丨"代表。管道符也是用来连接多条命令的,如"命令1丨命令2"。不过和多命令顺序执行不同的是,用管道符连接的命令,命令 1 的正确输出作为命令 2 的操作对象。这里需要注意,命令 1 必须有正确输出,而命令 2 必须可以处理命令 1 的输出结果;而且命令 2 只能处理命令 1 的正确输出,而不能处理错误输出。
举个例子,我们经常需要使用"||"命令査看文件的长格式,不过在有些目录中文件众多,比如 /etc/ 目录,使用"ll"命令显示的内容就会非常多,只能看到最后的内容,而不能看到前面输出的内容。
这时,我们马上想到 more 命令可以分屏显示文件内容,可是怎么让 more 命令分屏显示命令的输出呢?我想到了一种笨办法:
[root@localhost ~]# ll -a /etc/ > /root/testfile #用输出重定向,把ll命令的输出保存到/root/testfile 文件中 [root@localhost ~]# more /root/testfile #既然testfile是文件,当然可以用more命令分屏显示了 总用量1784 drwxr-xr-x. 105 root root 1228810月 21 12:49. dr-xr-xr-x. 26 root root 4096 6月519:06.. …省略部分输出… -rwxr-xr-x. 1 root root 687 6月 22 2012 auto.smb --More--(7%)
可是这样操作实在不方便,这时就可以利用管道符了。命令如下:
[root@localhost ~]# ll -a /etc/|more
这条命令大家可以这样理解:先把"ll -a /etc"命令 的输出保存到某个临时文件中,再用 more 命令处理这个文件。也就是我们说的第一个命令的正确输出是第二条命令处理和操作的对象。
注意,ll 命令操作的是文件名,所以匹配时使用的是通配符。但是一旦加入管道符,管道符之后的内容相当于操作的是文件内容,所以匹配时使用的是正则表达式。
关于管道符,我们再举几个例子:
[root@localhost ~]# netstat -an | grep "ESTABLISHED" #查询一下本地所有网络连接,提取包含 ESTABLISHED(已建立连接)的行 #就可以知道我们的服务器上有多少已经成功连接的网络连接 [root@localhost ~]# netstat -an | grep "ESTABLISHED" | wc-l #如果想知道具体的网络连接数量,就可以再使用wc命令统计行数
Shell通配符用法分析
在 Bash 中,如果需要模糊匹配文件名或目录名,就要用到通配符。通过表 1 介绍一下常用的通配符。
通配符 | 作 用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如,[abc] 代表一定匹配一个字符,或者是 a,或者是 b,或 者是 c |
[-] | 匹配中括号中任意一个字符,- 代表一个范围。例如,[a-z] 代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9] 代表匹配一个不是数字的字符 |
举几个例子:
[root@localhost ~]# cd /tmp/ [root@localhost tmp]# rm -rf * #进入临时目录,删除所有文件 #这个也是通配符,代表当前目录中的所有文件 [root@localhost tmp]# touch abc [root@localhost tmp]# touch abcd [root@localhost tmp]# touch 012 [root@localhost tmp]# touch 0abc #建立几个测试文件 [root@localhost tmp]# ls * 012 0abc abc abed #"*"代表所有的文件 [root@localhost tmp]# ls ?abc 0abc #"?"匹配任意一个字符,所以会匹配 0abc,但是不能匹配 abc,因为"?"不能匹配空 [root@localhost tmp]# ls [0-9]*
012 0abc #匹配任何以数字开头的文件 [root@localhost tmp]# ls [^0-9]*
abc abcd #匹配不以数字开头的文件