输入和输出(echo,read,cat,管道,tee,重定向等)大全

在看这个之前,像俺这样没有基础的,得先看完网中人的《shell十三问》的前三章,在置顶处,所以前面echo的含义,参数,及基础用法等就不说了。
我下面的所有环境都在在REDHAT LINUX9下试验的
在LINUX中,要使转义符生效,需加参数-e

从echo的变量开始说起
如:e c h o命令输出转义符以及变量。

1. # echo -e "\007your home is $HOME , you are connected on `tty`"

2. your home is /root , you are connected on /dev/pts/1

3. # echo -e "\ayour home is $HOME , you are connected on `tty`"

4. your home is /root , you are connected on /dev/pts/1

5. #

复制代码

QUOTE:

本例中
\007或\a你可以让终端铃响一声
显示出$ H O M E目录,
并且可以让系统执行t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号 )。




在e c h o命令输出之后附加换行,可以使用\ n选项:

1. $ cat echod

2. #!/bin/sh

3. echo -e "this echo's 3 new lines\n\n\n"

4. echo "OK"

复制代码


编辑一个新echod,如上内容,然后运行输出如下:

1. $ ./echod

2. this echo's 3 new lines

3. 

4. 

5. 

6. OK

7. $

复制代码



在e c h o语句中使用跳格符,记住别忘了加反斜杠\:

1. $ echo -e "here is a tab\there are two tabs\t\tok"

2. here is a tab   here are two tabs               ok

3. $

复制代码



把一个字符串输出到文件中,使用重定向符号>。
在下面的例子中一个字符串被重定向到一个名为m y f i l e的文件中:

1. $ echo "The log files have all been done"> myfile

复制代码



或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:

1. $ echo "$LOGNAME carried them out at `date`">>myfile

复制代码



现在让我们看一下m y f i l e文件中的内容:

QUOTE:

The log files have all been done
sam carried them out at 六 11月 13 12:54:32 CST 2004




引号是一个特殊字符,所以必须要使用反斜杠\来使s h e l l忽略它的特殊含义。
假设你希望使用e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠\即可:

1. $ echo "\"/dev/rmt0"\"

2. "/dev/rmt0"

3. $

复制代码



其它用法:

--〉'echo'用法收集:) 
http://bbs.chinaunix.net/forum/viewtopic.php?t=424904

ANSI控制码 
http://bbs.chinaunix.net/forum/viewtopic.php?t=207837&highlight=%B7%C9%BB%D2%B3%C8

cat:显示文件内容,创建文件,还可以用它来显示控制字符。

注意:在文件分页符处不会停下来;会一下显示完整个文件。因此,可以使用m o r e命令或把c a t命令的输出通过管道传递到另外一个具有分页功能的命令中,使用命令less file可实现相同的功能。

如下形式

1. $ cat myfile | more

2. 或

3. $ cat myfile | pg

复制代码



c a t命令的一般形式为:

1. cat [options] filename1 ... filename2 ...

复制代码



1、显示名为m y f i l e的文件:

1. $ cat myfile

复制代码



2、显示m y f i l e 1、m y f i l e 2、m y f i l e 3这三个文件,可以用:

1. $ cat myfile1 myfile2 myfile3

复制代码



3、创建一个包含上述三个文件的内容,名为b i g f i l e的文件,可以用输出重定向到新文件中:

1. $ cat myfile1 myfile2 myfile3 > bigfile

复制代码



4、如果cat的命令行中没有参数,输入的每一行都立刻被cat命令输出到屏幕上,输入完毕后按< C T R L - D >结束

1. $ cat

2. Hello world 

3. Hello world  

4. <ctrl+d>

5. $

复制代码



5、新建文件

1. $cat >myfile

2. This is great

3. <ctrl-d>

4. $cat myfile

5. This is great

复制代码




cat:参数选项

使用方式:

1. cat [-AbeEnstTuv] [--help] [--version] fileName 

复制代码


说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案) 

参数: 

QUOTE:

-n 或 --number 由 1 开始对所有输出的行数编号 
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号 
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 
-v 或 --show-nonprinting 显示非打印字符




例:
显示时加上行号

1. $cp /etc/httpd/conf/httpd /usr/sam 

2. $ cat -n httpd.conf 

复制代码



把 httpd.conf 的内容加上行号后输入 httpd1.conf 这个文件里

1. $cat -n httpd.conf > httpd1.conf 

复制代码



对文件httpd.conf加上行号(空白不加)后显示

1. $ cat -b httpd.conf 

复制代码



把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。

1. $ cat -b textfile1 textfile2 >> textfile3

复制代码



清空/etc/test.txt档案内容 

1. $cat /dev/null > /etc/test.txt 

复制代码



使用 sed 与 cat 除去空白行 

1. $ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d' 

复制代码



-s项我试了一下,不成功,不知是不是用错了


其它参数来自:(这个我没试)
http://bbs.chinaunix.net/forum/viewtopic.php?t=438463&highlight=cat

cat 还可以在您查看包含如制表符这样的非打印字符的文件时起帮助作用。您可以用以下选项来显示制表符: 

QUOTE:

* -T 将制表符显示为 ^I 

* -v 显示非打印字符,除了换行符和制表符,它们使用各自效果相当的“控制序列”。例如,当您处理一个在 Windows 系统中生成的文件时,这个文件将使用 Control-M(^M)来标记行的结束。对于代码大于 127 的字符,它们的前面将会被加上 M-(表示“meta”),这与其它系统中在字符前面加上 Alt- 相当。 

* -E 在每一行的结束处添加美元符($)。 




显示非打印字符 

1. $ cat -t /etc/X11/XF86Config 

2. ... 

3. # Multiple FontPath entries are allowed (they are concatenated together) 

4. # By default, Red Hat 6.0 and later now use a font server independent of 

5. # the X server to render fonts. 

6. ^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType" 

7. ^IFontPath^I"unix/:7100" 

8. EndSection 

9. ... 

复制代码

1. $ cat -E /etc/X11/XF86Config 

2. ... 

3. # Multiple FontPath entries are allowed (they are concatenated together)$ 

4. # By default, Red Hat 6.0 and later now use a font server independent of$ 

5. # the X server to render fonts.$ 

6. $ 

7. FontPath "/usr/X11R6/lib/X11/fonts/TrueType"$ 

8. FontPath "unix/:7100"$ 

9. $ 

10. EndSection$ 

11. ... 

复制代码

1. $ cat -v /etc/X11/XF86Config 

2. ... 

3. ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@ 

4. P^@^O"M-X^O M-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@ 

5. @M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@ 

6. M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A= ^@ ^@ 

7. F^@^@ ^@M-9^@^H^@^@M-sM-$M-G^E(l!M-@M-^? 

8. ^IM-A5^@^@^D^@PM-^]M-^\X1M-H%^@^@^D^@tyM-G 

9. ...


tee:读取标准输入的数据,并将其内容输出成文件。 

  语   法:tee [-ai][--help][--version][文件…] 
  补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。 

  参   数:-a 附加到既有文件的面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数,数据会新增在该文件内容的最面,而不会删除原先之内容。 
       -i 忽略中断信号 
       --help 在线帮助 
       --version 显示版本信息 

  例一: 
  列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1ss-copy2ss-copy3: 
  

1. $ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3

复制代码



  例一: 把列出当前目录,并把结果结到myfile
  

1. $ls -l |tee myfile

复制代码




管道:可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:

1. 命令1 |命令2

2. 其中|是管道符号。

复制代码


上例就是

如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。


在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。表5 - 1列出了最常用的重定向组合,并给出了相应的文件描述符。
在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。

1. 常用文件重定向命令

2. command > filename 把把标准输出重定向到一个新文件中

3. command >> filename 把把标准输出重定向到一个文件中(追加)

4. command 1 > fielname 把把标准输出重定向到一个文件中

5. command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中

6. command 2 > filename 把把标准错误重定向到一个文件中

7. command 2 >> filename 把把标准输出重定向到一个文件中(追加)

8. command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)

9. command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件

10. 作为标准输出

11. command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入

12. command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符

13. command <&m 把把文件描述符m作为标准输入

14. command >&m 把把标准输出重定向到文件描述符m中

15. command <&- 把关闭标准输入

复制代码

你可能感兴趣的:(linux)