Linux----6----输入输出和管道及相关的命令

来源:互联网 发布:淘宝主图素材psd 编辑:程序博客网 时间:2024/06/07 07:45
 

Linux----6----输入输出和管道及相关的命令 

----------------------------------------------------------------------------------------------------------------------

在系统默认的情况下、Shell从键盘读(接收)命令的输入,并将命令的输出显示到屏幕中。

当然也可以在命令行中或shell脚本中指示shell将命令的输入输出重定向到文件。输入重定向是强迫命令从文件中读输入;输出重定向将命令的输出送到一个文件而不是屏幕。当产生错误信息时,这些错误信息将被送到标准错误在屏幕上显示。

Shell创建的每一个进程都要与文件描述符打交道,其实文件描述符就是linux系统内部使用的一个文件代号。文件描述符决定了从哪里读入命令所需的输入和将命令的输出以及错误显示到什么地方。

1:使用find命令查找和搜索文件和目录

(1)find  -name  文件名 :说明查找与指定文件名相匹配的文件,在文件中使用通配符,但必须在双引号之。

[dog@localhost app100]$ find -name "dog.*.*"

./dog.boy.white

./dog.boy.black

./dog.girl.white

./dog.girl.black

(2)find -name 文件名 -exec  rmlinux命令)  {} \;

 作用:在每一个所定位的文件上运行指定的命令。大括号{}的含义是将指定的文件名传递给它前面的命令使用。空格和反斜杠\和分号;表示命令的结束。

[dog@localhost app100]$ ls

dog.boy  dog.boy.black  dog.boy.white  dog.girl.black  dog.girl.white  dog.wolf

[dog@localhost app100]$ find -name "dog.boy.white" -exec rm  {} \;

[dog@localhost app100]$ ls

dog.boy  dog.boy.black  dog.girl.black  dog.girl.white  dog.wolf

(3)find -name 文件名 -ok  rmlinux命令)  {} \;

作用:在每一个所定位的文件上运行指定的命令。大括号{}的含义是将指定的文件名传递给它前面的命令使用。空格和反斜杠\和分号;表示命令的结束。与(2)不同之处在于它只是交互式的。

[dog@localhost app100]$ ls

dog.boy  dog.boy.black  dog.boy.white  dog.girl.black  dog.girl.white  dog.wolf

[dog@localhost app100]$ find -name "dog.boy.white" -ok rm  {} \;

< rm ... ./dog.boy.white > ? y

[dog@localhost app100]$ ls

dog.boy  dog.boy.black  dog.girl.black  dog.girl.white  dog.wolf

(4)find 目录名 -mtime +3 

作用:查找修改时间大于3天的文件,即过去三天没有修改过的文件;

find 目录名 -mtime  -3 

作用:查找修改时间小于3天的文件,即过去三天修改过的文件;

(5)Find  目录名 -size +3

作用:查找文件大小大于3512字节数据块的文件 

Find  目录名 -size  -3

作用:查找文件大小小于3512字节数据块的文件 

2:将输出重定向到文件中

默认情况下,如果同时产生了标准输出和标准错误信息,会同时显示到屏幕中,当然也可以使用重定向。

方法:① >  文件名:覆盖原文件的内容  

      ② >> 文件名:在原文键后面追加 

[cat@localhost cat]$ date > result

[cat@localhost cat]$ cat result

Mon Dec 19 10:04:53 CST 2011

3:重定向标准输出和标准错误

1)将标准输出信息和标准错误输出到不同的文件中:linux系统默认的标准输出,数字是1.可以同时将标准输出和标准错误输出输出到不同的文件中。

[cat@localhost cat]$ find /etc -name passwd 2>errors >output

[cat@localhost cat]$ ls

app  app100  app101  app102  errors  output  result

[cat@localhost cat]$ find /etc -name passwd 2>errors 1>output

[cat@localhost cat]$ ls

app  app100  app101  app102  errors  output  result

2)将标准输出信息和标准错误输出到相同的文件中

[cat@localhost cat]$ find /etc -name passwd > output_errors 2>&1   ////////*****

[cat@localhost cat]$ cat output_errors

find: /etc/sysconfig/pgsql: Permission denied

/etc/passwd

find: /etc/default: Permission denied

/etc/pam.d/passwd

find: /etc/httpd/conf/ssl.crl: Permission denied

find: /etc/httpd/conf/ssl.crt: Permission denied

find: /etc/httpd/conf/ssl.csr: Permission denied

find: /etc/httpd/conf/ssl.key: Permission denied

find: /etc/httpd/conf/ssl.prm: Permission denied

find: /etc/cups/certs: Permission denied

/etc/uucp/passwd

find: /etc/zebra: Permission denied

说明:2&1表示将标准错误输出2导出到标准信息1所指向的文件中。其实&代表的所有的文件描述符号(012)。故可以使用下面的表示方法。使用&>&1区别在于&可能输出一些不需要的多余信息。

[cat@localhost cat]$ find /etc -name passwd &> output_errors

[cat@localhost cat]$ head output_errors

find: /etc/sysconfig/pgsql: Permission denied

/etc/passwd

find: /etc/default: Permission denied

/etc/pam.d/passwd

find: /etc/httpd/conf/ssl.crl: Permission denied

find: /etc/httpd/conf/ssl.crt: Permission denied

find: /etc/httpd/conf/ssl.csr: Permission denied

find: /etc/httpd/conf/ssl.key: Permission denied

find: /etc/httpd/conf/ssl.prm: Permission denied

find: /etc/cups/certs: Permission denied

cut(剪切)命令与paste命令

1

①按区域或者行进行剪切:cut -f [列数n]  -d[列间的分隔符,默认为table]   文件名  

 

②按字符进行剪切:cut  -c[n个字符]-[m个字符文件名;严格按照列对齐进行剪切。

(2)paste命令的功能是将每一个文件中的每一行用Tab字符分隔开并顺序的写到标准输出上。可以使用paste将多个文件合并为一个文件。通过-d属性可以更改合并后的分隔符号默认为tab

[cat@localhost cat]$ paste name.txt salsy.txt  > r1.txt

[cat@localhost cat]$ cat r1.txt

hupeng  900

lilie   500

huahua  600

xiueyan 800

qm      888

lft     988

sb      144

可以看出paste命令将两个文件进行了合并为一个文件.

注意:paste的合并是横向添加,即横向合并。

如果纵向合并,则用>>. 以及cat指令进行重定向

5:使用col -x指令将Tab转换成空格

[cat@localhost cat]$ cat -A r1.txt

hupeng^M^I900^M$

lilie^M^I500^M$

huahua^M^I600^M$

xiueyan ^M^I800^M$

qm^M^I888^M$

lft^M^I988^M$

sb^M^I144^M$

可以看出^I就是Tab字符。

6:使用 sort命令进行排序

使用cat >创建文件,使用ctrl+D结束输入。

[cat@localhost cat]$ cat > test.sort

a

b

w

Q

A

B

L

l

o

s

[cat@localhost cat]$ sort test.sort

a

A

b

B

l

L

o

Q

s

w

可以看出使用sort命令将文件中字符进行排序,并且俺ASCii进行了排序。

参数说明:

① -r: 进行反向排序(降序),rreverse的第一个字母。

② -f: 忽略字符的大小写,ffolds的第一个字母。

③ -n: 以数字的顺序进行排序,nnumeric的第一个字母

④ -t: -t c表示以字符C为分隔符

⑤ -k: -k N表示按第N个字段排序

⑥ -u: 去掉输出中的重复行,uunipue的第一个字母。

sort  -rfu:表示按反向、忽略大小写、去掉重复行。 

7:使用uniq指令去掉文件中相邻的重复行,注意源文件的数据不变

原始数据如下:

cat@localhost cat]$ cat test.dat

a

A

A

b

c

b

c

w

k

l

1[cat@localhost cat]$ uniq test.dat

a

A

b

c

b

c

w

k

L

可以看出删除了相邻重复行的元素

2[cat@localhost cat]$ uniq -c test.dat

      1 a

      2 A

      1 b

      1 c

      1 b

      1 c

      1 w

      1 k

      1 l 

使用-c参数删除相邻重复行的元素后显示了重复的次数

3[cat@localhost cat]$ uniq -d test.dat

A

使用-d只显示重复行。

[cat@localhost cat]$ uniq -d -c test.dat

      2 A

4[cat@localhost cat]$ uniq -ci test.dat

      3 a

      1 b

      1 c

      1 b

      1 c

      1 w

      1 k

      1 l

使用-i忽略大小写,此时a处多了3

5[cat@localhost cat]$ uniq -ciu test.dat

      1 b

      1 c

      1 b

      1 c

      1 w

      1 k

      1 l

使用-u只显示唯一的行。

8:管道(|)操作

可以使用管道(|)操作符号链接两个(或多个)Linux操作系统命令。

语法:命令1|)命令2

功能说明:

①系统会将命令1的标准输出重定向为命令2的标准输入

②可以在任何两个命令之间插入一个管道操作符,(|)之后的命令将前面命令的标准输出作为标准输入。

③标准错误信息不通过管道传递

1:[dog@localhost dog]$ who

cat      :0           Dec 19 16:55

cat      pts/0        Dec 19 16:55 (:0.0)

dog      pts/1        Dec 19 20:24 (172.20.71.236)

[dog@localhost dog]$ who|wc -l

      3

说明:通过管道操作将who的标准输出作为了wc标准输入,这里计算行数,来获取当前工作的用户数

2[dog@localhost dog]$ ls -lF  /bin |more

说明:使用管道将ls -lF的标准输出作为more标准输入

④如果管道后命令有参数,则使用xargs命令用于管道后的命令使用参数的情况,并且它是将管道前每一个输出的数据作为管道后的输入,并组成一个命令参数列表。

[cat@localhost app]$ ls

app103  app104

[cat@localhost app]$ ls .|rm -r

rm: too few arguments

Try `rm --help' for more information.

可以看出

[cat@localhost app]$ ls .|xargs rm -r

[cat@localhost app]$ ls

说明:xargs的作用就是将管道前得所有的每一个输出和后面的命令参数进行衔接,组成一个命令参数列表。

⑤说明:实际应用中要根据实际管道前输出的情况,来选择xargs;如果是要对管道前标准输出是整体操作,则不加xargs;如果是对管道的标准输出的每一项操作,则要加上xargs.

9:使用tee命令分流输出(T型管道)

功能:将前一个命令的输出结果直接输入给后一个命令,同时还要将前面命令的结果保存到一个文件。

[cat@localhost app]$ cat app102 |tee r1 |cut -c1

I

q

h

h

h

[cat@localhost app]$ cat r1

I LOVE CHINA!xqy

qm

hjj

hj

hjl

可以看出使用tee分流命令获取了分流的数据

10:发送电子邮件

方法1

(1)命令格式mail -s  "邮件主题接收用户名    ;输入回车

(2)输入正文

(3)在结束的地方输入" ."输入回车

(4)Cc是复写本的意思,表示可以发送给其他用户,回车后推出

[cat@localhost app]$ mail -s "News" dog

I LOVE YOU~.

.

Cc:

方法2

(1)命令格式mail -s  "邮件主题接收用户名 指定文件 ;回车发送

[cat@localhost app]$ mail -s "News" dog <r1 

11:查看电子邮件

所有的电子邮件都存放在:/var/spool/mail/用户名中,linux为每一个用户准备了一个邮件箱(文件)以存放用户的电子邮件,其文件名(邮箱)就是用户名,它存放的目录为/val /spool/mai

[dog@localhost dog]$ cd /var/spool/mail

[dog@localhost mail]$ ls

cat  dog  root

[dog@localhost mail]$ ls -l

total 16

-rw-rw----    1 cat      mail            0 Nov 30 10:06 cat

-rw-rw----    1 dog      mail         1300 Dec 20 09:24 dog

-rw-------    1 root     root        11394 Dec 20 04:02 root

可以看出总共有三个邮箱,就本机的三个用户

说明:(1)普通用户不能使用cat浏览其他用户的邮件。超级用户可以。

(2)使用mail可用直接进入当前的用户的邮件箱

(3)使用q+Enter可把查看后的邮件删除

(4)使用 x+Enter 查看后不删除邮件

(5)输入数字+Enter则查看相对应的邮件。         

[dog@localhost mail]$ mail

Mail version 8.1 6/6/93.  Type ? for help.

"/var/spool/mail/dog": 4 messages 4 new

>N  1 cat@localhost.locald  Tue Dec 20 09:23  16/641   "News"

 N  2 cat@localhost.locald  Tue Dec 20 09:24  20/659   "News"

 N  3 cat@localhost.locald  Tue Dec 20 10:00  20/660   "Study"

 N  4 cat@localhost.locald  Tue Dec 20 10:35  19/676   "Study"     

12:利用管道发送邮件

[cat@localhost app]$ ls -l |mail -s "list of book"  dog   [dog@localhost mail]$ mail

Mail version 8.1 6/6/93.  Type ? for help.

"/var/spool/mail/dog": 5 messages 5 new

>N  1 cat@localhost.locald  Tue Dec 20 09:23  16/641   "News"

 N  2 cat@localhost.locald  Tue Dec 20 09:24  20/659   "News"

 N  3 cat@localhost.locald  Tue Dec 20 10:00  20/660   "Study"

 N  4 cat@localhost.locald  Tue Dec 20 10:35  19/676   "Study"

 N  5 cat@localhost.locald  Tue Dec 20 10:49  20/893   "list of book"

& 5

Message 5:

From cat@localhost.localdomain  Tue Dec 20 10:49:39 2011

Date: Tue, 20 Dec 2011 10:49:39 +0800

From: cat@localhost.localdomain

To: dog@localhost.localdomain

Subject: list of book

total 16

drwxrwxr-x    2 cat      cat          4096 Dec 20 08:06 app100

drwxrwxr-x    2 cat      cat          4096 Dec 20 08:06 app101

-rw-rw-r--    1 cat      cat            31 Dec 20 08:55 app102

-rw-rw-r--    1 cat      cat            31 Dec 20 09:09 r1       

 可以看出:通过管道一样可以发送邮件。邮件内容就是管道前命令的标准输出。

原创粉丝点击