本节内容:

 输入输出重定向.

 管道符的应用

 主要查找命令

 

一、重定向

文件描述符:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。(linux下一切皆文件。)

 

1标准输入输出

STDIN  标准输入  如:键盘文件   文件描述符为:0

STDOUT 标准输出  屏幕终端  文件描述符为:1

STDERR 错误输出  屏幕终端  文件描述符为:2

【例】

shell中可能经常能看到:xxxx   > /dev/null  2>&1   

/dev/null 代表空设备文件,是Linux系统中的黑洞文件。放多少东西都填不满。

 

2输出重定向

> 将命令输出写入文件或设备,而不是命令提示符或句柄

< 从文件而不是从键盘或句柄读入命令输入

>& 将一个句柄的输出写入到另一个句柄的输入中

<& 从一个句柄读取输入并将其写入到另一个句柄输出中

>> 将命令输出添加到文件末尾而不删除文件中已有的信息

 

2.1输出重定向 >

>  #代表重定向到哪里

1> # 1表示stdout标准输出,系统默认值是1,所以">  /dev/null"等同于"1>  /dev/null"

【例】

[root@xuegod163 Desktop]# ls /home/ > /dev/null
[ root@xuegod163 Desktop]# cat /dev/null 
[root@xuegod163 Desktop]# ls /home/ > a.txt
[root@xuegod163 Desktop]# cat a.txt 
mk
[root@xuegod163 Desktop]# ls /home/ 1> b.txt
[root@xuegod163 Desktop]# cat b.txt 
mk

2> #表示stderr标准错误

【例】

[root@xuegod163 Desktop]# ls /homee/
ls: cannot access /homee/: No such file or directory
[root@xuegod163 Desktop]# ls /homee/ 2> err.txt
[root@xuegod163 Desktop]# cat err.txt 
ls: cannot access /homee/: No such file or director

2.2& 表示等同于

2>&1   #表示2的输出重定向等同于1输入的路径。  

标准错误输出重定向等同于标准输出的路径,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

【例】 

[root@xuegod163 Desktop]# ls /home/ /homee/ > all.txt 2>&1
[root@xuegod163 Desktop]# cat all.txt 
ls: cannot access /homee/: No such file or directory
/home/:
Mk
[root@xuegod163 Desktop]# ls /home/ /homee/ > /dev/null 2>&1
[root@xuegod163 Desktop]# cat /dev/null

2.3输出重定向>>

>>表示追加,即源文件保持不变,在文件的结尾加上>>符号前的内容;

【例】

[root@xuegod163 Desktop]#cat /etc/passwd >> a.txt

2.4> 和>> 的区别

> 每次都产生新文件。

>> 是追加,不产生新的文件。

 

3输入重定向

wc

1.命令格式:

wc [选项]文件...

2.命令功能:

统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。

3.命令参数:

-c 统计字节数。

-l 统计行数。

-m 统计字符数。这个标志不能与 -c 标志一起使用。

-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。

-L 打印最长行的长度。

-help 显示帮助信息

--version 显示版本信息

【例】

[root@xuegod163 Desktop]# wc /etc/passwd
  36     60                     1753             /etc/passwd
行     字数(以空格为分隔符)  大小(字节为单位)
 [root@xuegod163 Desktop]# wc < /etc/passwd
  36   60 1753
<<EOF

【例】

[root@xuegod163 Desktop]# cat  > a.txt  
aakds
sdfksf
ctrl+D  #输入的结束

 

【例】 

[root@xuegod163 Desktop]# cat > a.txt <<eof
> mk
> xuegod.cn
> www
> www
> eof

【注】:以<<EOF开始,以EOF结尾 。EOF只是一个统用户一个结果标识符号。换成其他任何字母做标识符也可以,要保证开始的和结尾的要一致,同时区分大小写。

 

二、管道符

1管道符含义

| 从一个命令中读取输出并将其写入另一个命令的输入中;也称为管道操作符

[root@xuegod163 Desktop]# ps -axu | grep init

2tee命令

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

注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。

格式:tee

只输出到标准输出,因为没有指定文件嘛。

格式:tee file

输出到标准输出的同时,保存到文件file中。如果文件不存在,则创建;如果已经存在,则覆盖之。(If a file being written to does not already exist, it is created. If a file being written to already exists, the data it previously
contained is overwritten unless the `-a' option is used.)

格式:tee -a file

输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建;如果已经存在,就在末尾追加内容,而不是覆盖。

格式:tee -

输出到标准输出两次。(A FILE of `-' causes `tee' to send another copy of input to standard output, but this is typically not that useful as the copies are interleaved.)

格式:tee file1 file2 -

输出到标准输出两次,同时保存到file1和file2中。

【例】 

[root@xuegod163 Desktop]# w | tee w.txt     #同时会打印出w命令
[root@xuegod163 Desktop]#w > b.txt         #同时不打印出w命令

三、查找命令

which        查看可执行文件的位置 

whereis      查看可执行文件的位置 及相关文件

locate        配合数据库缓存,快速查看文件位置

grep          过滤

find          实际搜寻硬盘查询文件名称 

 

1 which 和whereis

#which CHMMAND

#whereis CHMMAND

which语法:

[root@xuegod163 ~]# which 可执行文件名称

 

例如:

[root@xuegod163 ~]# which passwd

/usr/bin/passwd

 

which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件

whereis语法:

[root@xuegod163 ~]# whereis [-bmsu] 文件或者目录名称

 

参数说 明:
-b : 只找二进制文件
-m: 只找在说明文件manual路径下的文件
-s : 只找source源文件
-u : 没有说明文档的文件
例如:

[root@xuegod163 ~]# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

将和passwd文件相关的文件都查找出来


[root@xuegod163 ~]# whereis -b passwd

passwd: /usr/bin/passwd /etc/passwd

只将二进制文件 查找出来

 

【例】

which whereis主要的区别
[root@xuegod163 ~]# which  ls
alias ls='ls --color=auto'
/bin/ls
[root@xuegod163 ~]# which  find
/usr/bin/find
[root@xuegod163 ~]# whereis ls     #更详细的显示命令由哪个包安装的
ls: /bin/ls /usr/share/man/man1/ls.1.gz  /usr/share/man/man1p/ls.1p.gz

locate 

[root@ xuegod163 ~]# updatedb   #使用前,用此命令更新数据库,否则最新创建的文件找不到。 晚上2:00左右自动更新。 在计划任务中有。locate 配合数据库缓存,快速查看文件位置 

【例】

[root@xuegod163 ~]# touch /etc/mk.txt
[root@xuegod163 ~]# locate /etc/mk.txt
[root@xuegod163 ~]# ll /etc/mk.txt
-rw-r--r-- 1 root root 0 Jan 28 21:37 /etc/mk.txt
[root@xuegod163 ~]# 
[root@xuegod163 ~]# updatedb   #手动更新
[root@xuegod163 ~]# locate /etc/mk.txt
/etc/mk.txt

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。

 

3查看帮助文档

man updatedb

wKiom1ZCon-AfmjSAACltyRQNro507.png

grep过滤

【例】

 [root@xuegod163 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
     [root@xuegod163 ~]# grep --color root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

说明:find搜索文件系统、实时搜索

格式:find [目录] [条件] [动作]

(1). [目录]

不输入代表当前目录

  #find /home    #查找home目录下

(2). [条件]

主要有用户和组:-user -group   -nouser(没有拥有组的文件)  -nogroup

例10: -user  查找/home下拥有者为mk的文件:

[root@xuegod163 ~]# find /home/ -user mk

1. 按类型

-type ( f 文件 , d 目录 , l 连接 , p 管道 ,c 字符文件 ,b 块文件 ,s socket文件 )

[root@xuegod163 Desktop]# find /home/  -type d
[root@xuegod163 Desktop]# find /dev/ -type b
2. 按名字

-gid n :寻找群组ID为n的文件
-group name :寻找群组名称为name的文件
-uid n :寻找拥有者ID为n的文件
-user name :寻找用户者名称为name的文件
-name file :寻找文件名为file的文件(可以使用通配符)

【例】查看home包括关键词user的文件和文件夹

[root@xuegod163 Desktop]# useradd  user1
[root@xuegod163 Desktop]# useradd vipuser3
[root@xuegod163 Desktop]# touch /home/user1/aaauserccc
[root@xuegod163 Desktop]# find /home/ -name *user*  #  *匹配所有字符
3. 按大小  

 -size   +NM 大于N兆   -NG 小于NGB

[root@xuegod163 Desktop]# find /boot/ -size +2M
[root@xuegod163 Desktop]# find /boot/ -size -2M
4. 按时间

-mtime  -atime  -ctime

查看

touch b.sh
date -s "2015-01-30"
find /tmp/ -mtime 1  
-mtime +2    查看不含今天的2天前被修改的所有文件,如:今天是9月6日,则找出3日及3日之前,被修改的内容。

-atime n :将n*24小时内存取过的的文件列出来“访问时间(access time)”
-ctime n :将n*24小时内改变、新增的文件或者目录列出来“改变时间(change time)”
-mtime n :将n*24小时内修改过的文件或者目录列出来“修改时间(modification time)”
-newer file :把比file还要新的文件列出来

例12:改变和修改之间的区别在于是改文件的属性还是更改它的内容。

chmod a-w myfile,那么这是一个改变;改变的ctime

echo foo >> myfile,那么这是一个修改。mtime :“修改时间

ctime,改变是文件的索引节点发生了改变;mtime 修改是文本本身的内容发生了变化。

【例】

 ls(1) 命令可用来列出文件的 atime、ctime 和 mtime。

ls -lc filename         列出文件的 ctime
ls -lu filename         列出文件的 atime
ls -l filename          列出文件的 mtime

【例】

对比atime、ctime 和 mtime 的不同点
[root@xuegod163 ~]# vim a.txt   #写入aaaa
[root@xuegod163 ~]# date -s '13:42'
Sat Dec 27 13:42:00 CST 2014
[root@xuegod163 ~]# chmod +x a.txt 
[root@xuegod163 ~]# date -s '13:44'
Sat Dec 27 13:44:00 CST 2014
[root@xuegod163 ~]# cat a.txt 
aaaaaaa
[root@xuegod163 ~]# ll a.txt 
-rwxr-xr-x 1 root root 8 Dec 27 13:40 a.txt
[root@xuegod163 ~]# ll -c a.txt 
-rwxr-xr-x 1 root root 8 Dec 27 13:42 a.txt
[root@xuegod163 ~]# ll -u a.txt 
-rwxr-xr-x 1 root root 8 Dec 27 13:44 a.txt
6. 按权限:-perm
[root@xuegod163 ~]# find /boot/ -perm 755  #等于0775权限的文件或目录
-perm  -
suid 4   suid 2  sticky  1
[root@xuegod163 ~]# find /tmp -perm -777   #至少有777权限的文件或目录

【例】高级权限

[root@xuegod163 ~]# mkdir ccc
[root@xuegod163 ~]# chmod 777 ccc
[root@xuegod163 ~]# mkdir test
[root@xuegod163 ~]# chmod 1777 test
[root@xuegod163 ~]# touch b.sh
[root@xuegod163 ~]# chmod 4777 b.sh
[root@xuegod163 ~]# find /root/ -perm 777   #只能找到777权限的文件
[root@xuegod163 ~]# find /root/ -perm 1777  #只能找到1777权限的文件
[root@xuegod163 ~]# find /root/ -perm  4777  #只能找到4777权限的文件
[root@xuegod163 ~]# find /root/ -perm  -777  # 找到所有777权限的文件
7. 按查找的目录深度
[root@xuegod163 ~]# find /boot/ -maxdepth 1 #只查找目录第一层的文件和目录
[root@xuegod163 ~]# find /boot/ -maxdepth 2

8. 多条件结合

【实例如下】

-a  -o  !   或  -and  -or  -not

在/root找其他人可以写的文件

[root@xuegod163 ~]# find -type f  -and -perm -002
[root@xuegod163 ~]# find -type f  -and -perm /o+w 
./b.sh

主要动作

-print: find命令将匹配的文件输出到标准输出。 

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为          

'command' {  } \;,注意{   }和\;之间的空格。 

-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell

命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

【例】找到一个目录下的所有文件并删除

[root@xuegod163 ~]# mkdir test2
[root@xuegod163 ~]# cp /etc/passwd test2/
[root@xuegod163 ~]# cp -r /boot/ test2/
[root@xuegod163 ~]# find /root/test2 -type f -exec rm {} \;

参数解释:

 -exec             执行命令  

 rm 要执行的命令

 {} 表示find -type f 查找出来了文件内容

 \;   {} 和 \;之间要有空格。 固定语法,就是以这个结尾

 

 

当我们用whereis和locate无法查找到我们需要的文件时,可以使用find,但是find是在硬盘上遍历查 找,因此非常消耗硬盘的资源,而且效率也非常低,因此建议大家优先使用whereis和locate。
locate 是在数据库里查找,数据库大至每天更新一次。
whereis 可以找到可执行命令和man page
find 就是根据条件查找文件。
which 可以找到可执行文件和别名(alias)

 

                 学神-IT-教育51cto技术交流群:468845589  快来上我们公开课吧!

                                       学神MK老师:1273815479

                                       学神ZY老师:3054384936

 

 

                                                                                                         学神IT-VIP-1508-公瑾编译提供