Linux学习Day4:管道符、重定向与环境变量
仅仅是学习Linux系统的命令还不够,只有把多个命令按照自己想要的方式进行组合使用,才能提高工作效率。今天的内容主要是关于如何把命令组合在一起使用,使得输入的命令更准确、更高效,也为接下来的Shell脚本打好基础。
一、输入输出重定向
输入重定向:指把文件内容导入到命令中。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。输出重定向:指把原本要输出到屏幕的数据信息写入到指定的文件中,又分为标准输出重定向和错误输出重定向两种。
-
- 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令输入。
- 标准输出重定向(STDIN,文件描述符为1):默认输出到屏幕。
- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
要区别对待两种输出信息,第一种是命令的标准输出信息,第二种是命令的报错提示信息(错误输出),如下所示:
[root@linuxprobe ~]# ls -l anaconda-ks.cfg -rw-------. 1 root root 1032 Feb 18 2019 anaconda-ks.cfg //ls命令的标准输出信息,也是我们想要的信息 [root@linuxprobe ~]# [root@linuxprobe ~]# ls -l xxxxx ls: cannot access xxxxx: No such file or directory //因为xxxxx文件不存在,所以输出的是报错提示信息 [root@linuxprobe ~]#
对于输入重定向来说,用到的符号及其作用如下所示:
符号 | 作用 |
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止(分界符可以自己定义,如"EOF"、"over"等) |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
对于输出重定向来说,用到的符号及其作用如下所示:
符号 | 作用 |
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原来文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有文件的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出和错误输出共同写入到文件中(追加到原有内容的后面) |
通过标准输出重定向将 man ls 命令原本要输出到屏幕的信息写入文件readme.txt中,然后显示readme.txt文件中的内容,具体命令如下:
[root@linuxprobe ~]# man ls > readme.txt [root@linuxprobe ~]# [root@linuxprobe ~]# cat readme.txt LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified. ---------------------------------省略部分输出内容---------------------
通过覆盖写入模式向readme.txt文件中写入一行数据,然后再通过追加写入模式再写入一行数据,具体命令如下:
[root@linuxprobe ~]# echo "Welcome to my home" > readme.txt //清除原有的内容 [root@linuxprobe ~]# echo "Learning Linux is happy to me" >> readme.txt //追加至原来文件内容的后面 [root@linuxprobe ~]# [root@linuxprobe ~]# cat readme.txt Welcome to my home Learning Linux is happy to me [root@linuxprobe ~]#
如果想把命令的报错信息写入文件,该如何操作呢?
[root@linuxprobe ~]# ls -l xxxxx ls: cannot access xxxxx: No such file or directory //提示xxxxx文件不存在 [root@linuxprobe ~]# [root@linuxprobe ~]# ls -l xxxxx 2> readme.txt //将报错信息写入readme.txt文件 [root@linuxprobe ~]# [root@linuxprobe ~]# cat readme.txt ls: cannot access xxxxx: No such file or directory //报错信息写入readme.txt文件成功 [root@linuxprobe ~]#
输入重定向相对来说比较冷门,在工作中遇到的概率较小。输入重定向的作用是把文件内容直接导入命令中。接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计文件内容的行数。
[root@linuxprobe ~]# cat readme.txt ls: cannot access xxxxx: No such file or directory [root@linuxprobe ~]# [root@linuxprobe ~]# wc -l < readme.txt //使用输入重定向 1 [root@linuxprobe ~]#
二、管道命令符
管道符,即“|”,其执行的格式“命令A | 命令B”,当然可以这样使用:“命令A | 命令B | 命令C”。管道命令符的作用是把前一个命令A原本要输出到屏幕的标准正常数据当作是后一个命令B的标准输入,比如把搜索命令的输出值传递给统计命令,具体如下:
[root@localhost ~]# grep "/sbin/nologin" /etc/passwd | wc -l 19 [root@localhost ~]#
再比如用翻页的形式查看/etc目录中的文件列表及属性信息:
[root@localhost ~]# ls -l /etc/ | more total 1168
-rw-r--r--. 1 root root 16 Jun 18 2019 adjtime -rw-r--r--. 1 root root 1518 Jun 7 2013 aliases -rw-r--r--. 1 root root 12288 Jun 18 2019 aliases.db drwxr-xr-x. 2 root root 236 Jun 18 2019 alternatives -rw-------. 1 root root 541 Mar 31 2016 anacrontab -rw-r--r--. 1 root root 55 Nov 4 2016 asound.conf -rw-r--r--. 1 root root 1 Oct 30 2018 at.deny drwxr-x---. 3 root root 43 Jun 18 2019 audisp drwxr-x---. 3 root root 83 Jun 18 2019 audit drwxr-xr-x. 2 root root 22 Jun 18 2019 bash_completion.d -rw-r--r--. 1 root root 2853 Nov 5 2016 bashrc drwxr-xr-x. 2 root root 6 Nov 6 2016 binfmt.d -rw-r--r--. 1 root root 38 Nov 29 2016 centos-release --More--
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置的操作:
[root@localhost ~]# echo "123456" | passwd --stdin root //一条命令修改root用户密码 Changing password for user root. passwd: all authentication tokens updated successfully. [root@localhost ~]#
通过重定向技术能够一次性地把多行信息打包输入或输出,比如让用户一直输入内容,直到用户输入了其自定义地分界符时,才结束输入。这种方法在编写自动化脚本时经常用到。
[root@localhost ~]# mail -s "readme" root@localhost << over //"over"为用户自定义地分界符 > i think linux is very practical > i hope to learn more > can you teach me? > over //遇到分界符后结束输入,以上3行信息则为用户输入地有效内容 [root@localhost ~]#
三、命令行的通配符
通配符,顾名思义,就是通用的匹配信息的符号,常见的通配符如下所示:
- 星号(*)代表匹配零个或多个字符;
- 问号(?)代表匹配单个字符;
- 中括号内加上数字([0-9])代表匹配0~9之间的单个数字的字符;
- 中括号内加上字母([abc])则代表匹配a、b、c三个字中的任意一个字符。
匹配在/dev目录中所有以sda开头的文件:
[root@localhost ~]# ls -l /dev/sda* brw-rw----. 1 root disk 8, 0 Feb 20 23:57 /dev/sda brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1 brw-rw----. 1 root disk 8, 2 Feb 20 23:57 /dev/sda2 [root@localhost ~]#
匹配以sda开头,且后面还紧跟某一个字符的文件:
[root@localhost ~]# ls -l /dev/sda? //这个命令排除了/dev/sda文件 brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1 brw-rw----. 1 root disk 8, 2 Feb 20 23:57 /dev/sda2 [root@localhost ~]#
匹配以sda开头,且后面还紧跟某一个数字的文件:
[root@localhost ~]# ls -l /dev/sda[0-9] brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1 brw-rw----. 1 root disk 8, 2 Feb 20 23:57 /dev/sda2 [root@localhost ~]#
匹配以sda开头,且后面还紧跟1、3、5中的某一个数字的文件:
[root@localhost ~]# ls -l /dev/sda[135] brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1 [root@localhost ~]#
