linux系统管理学习笔记3-重定向和管道

linux系统管理学习笔记3-重定向和管道

重定向

本讲介绍linux中输入输出重定向。

unix 发明人总结的的设计准则是,一次只做一件事,并且做到最好。(Do one thing, and do it well)

一个好的程序,应该满足:

  1. 一次只做一件事,并做到最好。
  2. 能够与其他程序协同工作。
  3. 能够处理文本流。

为了让Linux 程序有效地协同工作,就需要对命令输入输出重定向。

用户与Linux 的交互,通过shell实现。

Bash 有三种标准输入输出流,并且分别有各自的文件标识号

  1. 标准输入流 stdin,一般指终端键盘,文件描述符为 0
  2. 标准输出流 stdout,一般指终端屏幕,或图形界面上的终端窗口,文件描述符为 1
  3. 错误输出流 stderr,一般也是指终端屏幕,或图形界面上的终端窗口,文件描述符为 2

简而言之:

  • 输出重定向就是,将默认的stdout 或者stderr 转而将命令输出到某个文件中。

  • 输入重定向就是,将默认的stdin 转而使用来自某个文件进行输入。

Linux shell中输出重定向的实现命令

  • Linux 中使用右箭头符,或双右箭头符来重定向标准输出
#标准输出流
ls /tmp/example/
# 错误输出流
ls /tmp/example/file04

# 输出重定向, 1表示被重定向的是标准输出,>后为跟的要输出为的文件名称,若stdout.txt文件不存在,则被创建。若stdout.txt已存在,则覆盖原文件。若将>改为>>,则是将输出内容追加至文件内容后面。
ls -l /tmp/example/ 1> ./stdout.txt
ls -l /tmp/example/ 1>> ./stdout.txt
# 重定向错误输出流,将文件标识符1改为2即可
ls -l /tmp/example/file04 2> ./stderr.txt
ls -l /tmp/example/file04 2>> ./stderr.txt

# 同时重定向命令的标准输出流和错误输出流为不同文件。使用&> 将1 2 输出重定向为一个文件。
ls -l /tmp/example/file01 /tmp/example/file04 1>> ./stdout.txt 2>> ./stderr.txt
ls -l /tmp/example/file01 /tmp/example/file04 &> ./stdouterr.txt

结合echo 命令(将内容回显在终端屏幕上)和输出重定向,可以实现创建指定内容的文本文件,举例

# echo命令,-e选项表示输出转义字符
echo -e "1 apple\n2 pear\n3 banana"

echo -e "1 apple\n2 pear\n3 banana" >fruit.txt
cat ./fruit.txt

利用输出重定向命令,来实现忽略命令的错误输出(即屏幕不显示命令的错误输出)。即错误输出到 /dev/null 文件中,/dev/null非常特殊,可以视为一个“系统的黑洞”,写入到这个文件中的内容都被丢弃了。举例:

ls -l /tmp/example/file01 /tmp/example/file04 2>>/dev/null

Linux shell中输入重定向的实现命令

  • Linux 中使用左箭头符,或双左箭头符来重定向标准输入
# 将标准输入重定向为外部的文件
# 介绍替换命令 tr命令和输入重定向的联合使用
# tr [准备要被替换的字符] [要替换成的字符]
# 替换fruit.txt文件的空格为制表符
tr ' ' '\t' <./fruit.txt

# 将外部文件输入重定向为标准输入
# 介绍排序sort命令和输入重定向的联合使用
# sort -k [关键字字段序号] [要排序的文本文件]
sort -k2 <<EOF
1 apple
2 pear
3 banana
EOF

#例子中的EOF 是界定符,可以自定义为其他字符(不过要注意结尾的界定符要顶格写,前后不能有任何字符或空格)。通过界定符,就将原本sort命令中需要的文本文件,重定向为标准输入。

管道

本讲介绍管道使用,管道就是一种特殊的输入输出重定向,即将一个命令的标准输出作为下一个命令的标准输入。

管道操作符是 竖线 | , 构造管道只需要使用竖线将命令连起来即可。

需要注意的是,管道操作符右边的命令必须要能够接受标准输入流才可以。能够接收标准输入流的命令并不多,一般为文本操作命令,常用的有 grep cut head tail less more wc tr sort

接下来介绍grep cut wc命令

举例

# 对命令的输出进行分页查看,可以逐行逐页地查看命令输出
ls -al /etc |less

# grep 是文本查找命令,兼容正则表达式
# grep [待查找文本] [待查找文件]
# 查找ls输出中带有ssh字样的行
ls -al /etc |grep 'ssh'

# 文本提取和统计, wc	cut
# cut为文本切割命令, -c选项后紧跟的数字表示切割的字符列序号,可以切割多列,数字之间用逗号隔开
cat ~/install.log| cut -c1,2 
# cut -d 和-f 选项,实现按指定分隔符分开的文本来切割文本。-d后紧跟分隔符,-f后紧跟的数字表示切割的字段序列号。以下命令表示,切割cat输出内容的第一个字段,字段是用冒号隔开的。
cat /etc/passwd | cut -f1 -d":"

# wc 命令,统计文本文件或者标准输出中的文本行数、单词数和字节数
# wc -l 选项表示仅统计文本行数
# 举例,统计当前用户家目录下所有目录文件的数目 (切割每一行中的第一字符列,d 表示文件类型为目录文件)
ls -al ~ | cut -c1 | grep "d" | wc -l

提醒,管道不会传递错误输出。如果不希望看到管道中的错误输出,可以将其中的某一步重定向到dev/null文件中。

ls -al /bin/sbni 2>/dev/null | wc -l
posted @ 2020-03-28 10:04  songbiao  阅读(470)  评论(0编辑  收藏  举报