1.标准输入、标准输出、错误输出
shell中常有这样的操作:
#查询名称为base-service的java进程信息,并将查询到的信息以覆盖的方式输出到infotest.txt文件
ps -ef | grep java | baser-service >./test/infotest.txt
脚本只使用标准输入、标准输出和标准错误
Shell会自动打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。
标准输入是命令的输入,默认指向键盘;
标准输出是命令的输出,默认指向屏幕;
标准错误是命令错误信息的输出,默认指向屏幕。
如果没有显式地进行重定向,命令通过文件描述符0从屏幕读取输入,通过文件描述符1和2将输出和错误信息输出到屏幕。但如果我们想从其他文件读取输入或产生输出,就需要对0、1、2使用重定向了。其语法如下:
#把标准输入重定向到filename文件中
command < filename
#把标准输入重定向到filename文件中
command 0< filename
#把标准输出重定向到filename文件中(覆盖)
command > filename
#把标准输出重定向到filename文件中(覆盖)
command 1> fielname
#把标准输出重定向到filename文件中(追加)
command >> filename
#把标准输出重定向到filename文件中(追加)
command 1>> filename
#把标准错误重定向到filename文件中(覆盖)
command 2> filename
#把标准输出重定向到filename文件中(追加)
command 2>> filename
#把标准输出和标准错误一起重定向到filename文件中(覆盖)
command > filename 2>&1
#把标准输出和标准错误一起重定向到filename文件中(追加)
command >> filename 2>&1
#把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command < filename >filename2
#把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command 0< filename 1> filename2
重定向使用的一些注意事项:
标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&。
文件描述符与重定向符号之间不能有空格!
在字符终端环境中,输入即指对一个应用程序或命令的输入,无论是从键盘输入还是从别的文件输入;输出即指应用程序或命令产生的一些信息;与 Windows 系统下不同的是,Linux 系统下还有一个标准错误输出的概念,这个概念主要是为程序调试和系统维护目的而设置的,错误输出和标准输出分开可以让一些高级的错误信息不干扰正常的输出信息,从而方便一般用户的使用。
在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。
2.管道
管道使用竖线|连接多个命令,这被称为管道符。 管道的具体语法格式如下:
command1 | command2
command1 | command2 [ | commandN... ]
当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。
pipe管道命令|,仅能处理经由前面一个指令传来的信息,也就是标准输出(standard output)的信息,对于标准错误输出(standard error output)没有处理能力
例如:我们想要查询base-service节点是否处于启动状态,可以使用命令:
ps -ef | grep base-service
此时,如果base-service节点有关的进程如果有多个,就会一起查询出来,那可以使用管道进行多层过滤:
#查询启动的base-service的java进程,且版本为20210107
ps -ef | grep base-service | grep java | grep 20210107**加粗样式**
重定向和管道区别:
简单地说,重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出
3.shell中的特殊变量
变量 | 含义 |
---|---|
$n | 用于接收位置参数,接收执行脚本时传入的参数 |
$0 | 当前脚本的文件名。 |
$n(n>1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值, |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID |
4.shell过滤器
几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出
过滤器的特点:
- 如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
- 过滤器通常与 Linux 管道一起使用。
常用的被作为过滤器使用的命令如下:
命令 | 说明 |
---|---|
awk | 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。 |
cut | 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。 |
grep | 用于搜索一个或多个文件中匹配指定模式的行。 |
tar | 用于归档文件的应用程序。 |
head | 用于读取文件的开头部分(默认是 10 行)。如果没有指定文件,则从标准输入读取。 |
paste | 用于合并文件的行。 |
sed | 用于过滤和转换文本的流编辑器。 |
sort | 用于对文本文件的行进行排序。 |
split | 用于将文件分割成块。 |
strings | 用于打印文件中可打印的字符串。 |
tac | 与 cat 命令的功能相反,用于倒序地显示文件或连接文件。 |
tail | 用于显示文件的结尾部分。 |
tee | 用于从标准输入读取内容并写入到标准输出和文件。 |
tr | 用于转换或删除字符。 |
uniq | 用于报告或忽略重复的行。 |
wc | 用于打印文件中的总行数、单词数或字节数。 |
其中 grep、sed、awk在实际中使用较为广泛