Linux运维相关(四)
学习Linux运维过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。
—— shell 输入与输出 ——
echo
-
作用:将一行字符串显示到标准输出
-
echo 命令的一些细节在 System V、BSD 和 Linux 这三种 Like-UNIX 系统上不同,这里以 Linux 系统为主。
-
Usage:
echo [-e] [-n] STRING
- STRING : STRING 是要输出的字符串,其中可以包含 shell 变量名、转义符等,一般用双引号括起来。
- -e : Linux 的 echo 缺省不解释 STRING 中的转移符,除非加上此选项。
- -n : echo 缺省在输出 STRING 后输出 NEWLINE(换行),使用此选项 echo 将不输出 NEWLINE。
- echo 支持的转移符: \NNN ASCII 码为 NNN(8 进制)的字符,NNN 如果不是一个合理的值,将直接按照字面打印
\a 响铃 \b 退格 \c 去除结尾NWELINE 字符 \f 换页 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \\ 反斜线 - 举例:
echo -e "User: $USER\tUID: $UID"
显示User: zqf UID: 500
read
- 作用:从键盘或文件的某一行文本中读入信息,并将其赋给变量。
- Usage:
read varible1 varible2 ...
- 如果只指定了一个变量,read 将会把输入行的所有内容赋给该变量,直至遇到第一个文件结束符或回车。
- 如果指定了多个变量,read 用空格(环境变量 IFS)作为分隔符把输入行分成多个域,分别赋给各个变量。
- 输入文本分隔出的域数量多于 read 给出的变量数,read 将所有的超长部分赋予最后一个变量。
管道
- 可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠"|"表示。
- Usage:
command1 | command2
- 举例:
ls | grep "*.c"
// 将 ls 命令的输出作为 grep 命令的输入,即在当前目录下搜索 C 源程序文件 - sed、awk 和 grep 等程序都很适合用管道,特别是在 shell 命令行下。
tee
- 作用:它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中
- Usage:
tee -a filename
- -a : 表示追加到文件末尾。
- tee 命令应该和管道结合使用
- 举例:
who | tee who.out
// who 命令的输出不仅会输出到标准输出,还会输入到文件 who.out
标准输入、输出和错误
- 文件描述符: 文件描述符是从 0 开始的整数,指向与进程相关的特定数据流。当进程启动时,通常打开三 个文件描述符,分别对应三种标准的 I/O: 标准输入(文件描述符 0),标准输出(文件描述符 1),标准错误(文 件描述符 2)。
- 标准输入(STDIN) : 它是命令的输入,缺省和终端的键盘关联。
- 标准输出(STDOUT): 它是命令的输出,缺省和终端的屏幕关联。
- 标准错误(STDERR): 它是命令的错误信息输出,缺省也和终端的屏幕关联。
- 如果进程打开了额外的文件进行输入和输出,则其被设置为下一个可用的文件描述符,从 3 到 9。
文件重定向
-
在执行命令时,命令的标准输入、输出和错误是和文件描述符 0、1、2 关联的,而文件描述符 0、1、2 缺 省都和终端关联。如果希望命令从文件中读取标准输入或者希望命令的标准输出写到文件而不是屏幕,就需要 使用文件重定向。
-
重定向标准输出
① CMD > filename : 把 CMD 命令的标准输出重定向到一个文件中(如果文件存在,其内容将被覆盖)。
② CMD >> filename : 把 CMD 命令的标准输出重定向到一个文件中(追加文件尾部)。
③ > myfile: 创建一个长度为 0 的空文件,如果文件存在清空该文件。
④ 举例:ls -l | grep ^d >>files.out // 把当前目录下的子目录的列表写到文件 files.out 中 > zqf.log // 清空日志文件 zqf.log
⑤ CMD > filename 实际上是和 CMD 1> filename 等效,CMD >> filename 和 CMD 1>> filename 等效。
-
重定向标准输入
① CMD < filename : 以 filename 文件作为 CMD 命令的标准输入。
② CMD << DELIMITER : 从标准输入中读入输入,直至遇到 DELIMITER 分界符。(here-document)
③ 举例:
sort < grade.txt
// 对文件 grade.txt 进行排序(sort)
④ CMD < filename 实际上是和 CMD 0< filename 等效,CMD << filename 和 CMD 0<< filename 等效。 -
重定向标准错误
① CMD 2 > filename : 把 CMD 命令的标准错误重定向到一个文件中(如果文件存在,其内容将被覆盖)。
② CMD 2 >> filename : 把 CMD 命令的标准错误重定向到一个文件中(追加文件尾部)。
③ 举例:
find / -name "*.tmp" -exec rm -rf {} \; 2>/dev/null
// 把命令的错误消息输出丢弃 。 -
结合使用标准输出和标准错误
① CMD 1> file1 2> file2 : 将输出重定向到 file1 中,并把标准错误重定向到 file2 中。② CMD < file1 > file2 : 以 file1 文件作为 CMD 命令的标准输入,以 file2 文件作为标准输出。
③ 举例:
find / -name "*.tmp" -print 1>find.out 2>find.err
// 把 find 的搜索结果写到文件 find.out 中,而把 find 命令的错误信息(比如没有足够权限搜索某些目录)写到文件 find.err 中
cat <1.txt >2.txt
// 实际是将 1.txt 的内容写到 2.txt,等效于文件复制 -
合并标准输出和标准错误
① CMD > filename 2>&1 : 把标准输出和标准错误一起重定向到一个文件中
② CMD >> filename 2>&1 : 把标准输出和标准错误一起重定向到一个文件中(追加)
③ 举例:
grep "standard" * > grep.out 2>&1
// 在当前目录下所有文本文件中搜索字符串"standard"
④ CMD > filename 2>&1 实际上可以看作 2 部分,"> filename"(重定向标准输出)和"2>&1"(把标准错误重 定向到标准输出)。 -
在使用一些接受文件名为参数的命令时,有时命令会把文件描述符当成是文件名参数而报错。一般文件描 述符和重定向符号之间留有不要有空格。