Linux 管道和重定向


重定向用来更改命令读取输入和写入输出的方式,命令的输入输出可以重定向。管道可以将一个命令的输出作为另一个命令的输入。


Linux中一切都是文件,shell预先定义了3个特殊文件:

  • 标准输入(standard input),stdin,文件描述符为0,默认从键盘读取输入
  • 标准输出(standard output),stdout,文件描述符为1,默认写到屏幕
  • 标准错误(standard error),stderr,文件描述符为2,默认写到屏幕

使用管道(pipe)操作符(|)可以连接多个命令组成很有用的命令流水线(pipeline),可完成很复杂的操作。

重定向操作符

重定向使用4个操作符:

  • >,将标准输出重定向到一个文件,重写文件
  • >>,将标准输出重定向到一个文件,输出附加到文件的最后
  • <,将标准输入重定向到一个文件,读取文件内容作为输入
  • |,操作符(|)之前的命令的输出重定向为操作符(|)之后命令的输入

如果要将标准错误重定向到一个文件,使用2>2>>写法。

$ ls -l > file1
$ ls -l /abcd 2> err
$ ls -l /abcd 2> /dev/null
$ > file1
$ ls | grep m

ls -l > file1命令将ls -l的输出写入文件file1。

ls -l /abcd 2> err命令将'不存在目录或文件/abcd'的错误信息写入文件err,如果目录/abcd不存在。

ls -l /abcd 2> /dev/null命令不会输出错误信息到屏幕,如果目录/abcd不存在。/dev/null是个特殊文件,它接收输入,但不做任何处理。

> file1命令清空文件file1,如果file1存在,否则新建一个空文件file1。

ls | grep m命令列出当前目录中文件名中包含m的所有文件。

cat

cat命令(concatenate)读取一个或多个文件的内容输出到屏幕。

$ cat file1
$ cat > file2
$ cat file2 | grep m

cat file1命令输出文件file1的内容到屏幕上。

cat > file2命令将你在控制台上输入的内容保存到文件file2中,记得按ctrl+d键结束输入。

cat file2 | grep m命令输出文件file2中所有包含m的行到屏幕上。

sort

sort命令对文本文件的所有行按字母或数字顺序进行排序。

$ sort file1
$ sort -k2 file1
$ sort -n -k2 file1

file1文件内容:

sam 30
tom 100
ken 20

sort file1命令按字母顺序对file1文件中的行进行排序。

输出:

ken 20
sam 30
tom 100

sort -k2 file1命令按字母顺序对file1文件的第2列进行排序。文件中一行有多列。

输出:

tom 100
ken 20
sam 30

sort -n -k2 file1命令按数字顺序对file1文件的第2列进行排序。文件中一行有多列。

输出:

ken 20
sam 30
tom 100

uniq

uniq命令对输入的行去掉重复数据(相同的行只保留一行),或输出相同行出现的次数。uniq一般和sort结合一起使用。

$ sort file1 | uniq
$ sort file1 | uniq -c

sort file1 | uniq命令按字母顺序对file1文件中的行进行排序,并去除重复的行。

sort file1 | uniq -c命令按字母顺序对file1文件中的行进行排序,输出相同行出现的次数。

wc

wc命令(word count)统计文件的行数、单词个数和字符个数。

$ wc file1
$ wc -l file1
$ wc -w file1
$ wc -c file1

wc file1命令统计文件的行数、单词个数和字符个数。

wc -l file1命令统计文件的行数。

wc -w file1命令统计文件的单词个数。

wc -c file1命令统计文件的字符个数。

grep

grep命令(globally search a regular expression and print)在文件中查找匹配指定模式(正则表达式)的行。grep一般和管道(|)一起使用。

grep命令的格式:

grep [选项] [正则表达式] [文件...]

$ grep hi file1
$ grep -i hi file1
$ grep -r hi .
$ grep -s hi * .*
$ ls /usr/bin | grep user
$ ls | grep -v hi
$ ls | grep --color hi

grep hi file1命令在file1文件中查找包含字符串hi的所有行。

grep -i h file1命令在file1文件中查找包含字符h或H的所有行,-i表示忽略大小写。

grep -r hi .命令在当前目录或子目录的所有文件中查找包含字符串hi的所有行。

grep -s hi * .*命令在当前目录的所有文件中查找包含字符串hi的所有行。*表示除去隐藏文件外的所有文件,.*表示所有隐藏文件。

ls /usr/bin | grep user命令列出目录/usr/bin中文件名包含user的文件。

ls | grep -v hi命令列出当前目录中文件名不包含hi的文件。

ls | grep --color hi命令列出当前目录中文件名包含hi的文件。--color选项会将hi使用颜色显示。

运行命令alias grep='grep --color',这样grep命令的输出就会显示颜色了。

head

head命令显示文件最前面指定行的内容,默认显示10行。

$ head file1
$ head -5 file1

head file1命令显示文件file1最前面10行的内容。

head -5 file1命令显示文件file1最前面5行的内容。

tail

tail命令显示文件最后面指定行的内容,默认显示10行。

$ tail file1
$ tail -5 file1
$ tail -f file1

tail file1命令显示文件file1最后面10行的内容。

tail -5 file1命令显示文件file1最后面5行的内容。

tail -f file1命令显示文件file1最后面10行的内容,如果有新的行被附加到文件file1,会马上显示到屏幕上,即可以监控文件的变化,常用来查看日志文件。按ctrl+z键退出该命令。

tee

tee命令从标准输入(stdin)读取内容,同时输出到标准输出(stdout)和文件。tee命令输出到标准输出的内容可以通过管道(|)继续做为下一个命令的输入。

tee(音T)的作用就象字母T一样,一个输入,两个输出。

$ ls /usr/bin | tee file1 | grep user

ls | tee file1 | grep hi命令保存当前目录下的所有文件名到文件file1中,并显示当前目录中文件名包含hi的所有文件。