本次发这篇博客比较晚,晚上快12点才发的,到今天一直没有,所以又发了一遍,这个篇文章主要有重定向和管道 | tee find 等实战操作,还有一些命令参数详解等。
重定向及管道
linux下一切皆文件。文件又可分为:普通文件、目录文件、链接文件和设备文件
Linux系统中使用文件来描述各种硬件,设备资源等
例如:硬盘和分区,光盘等设备文件
brw-rw----+ 1 root cdrom 11, 0 6月 24 16:53 sr0
重定向的含义
文件描述符定义:
是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID
用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标)
number Channel namedescripton default connectionusage
0stdinstandard inputkeyboardread only
1stdoutstandard output terminalwrite only
2stderrstandard errorterminalwrite only
3+filenameother filesnoneread and /or write
0表示的是标准输入 键盘
1表示的是标准输出 相当于终端或显示器
2表示的是标准错误 通过键盘和终端组合显示
1.查看某个进程信息
打开两个终端界面 pts1代表终端1.pts2代表终端2
pts1
[[email protected] ~]# passwd
更改用户 root 的密码 。
新的 密码:
pts2
[[email protected] fd]# ps aux | grep passwd
root 3606 0.0 0.4 168080 1992 pts/0 S+ 19:48 0:00 passwd
root 3832 0.0 0.1 103256 848 pts/1 S+ 20:45 0:00 grep passwd
[[email protected] ~]# cd /proc/3606
[[email protected] 3606]# ls #此目录下是有关此进程的所有信息
attr coredump_filter io mountstats pagemap stack
autogroup cpuset limits net personality stat
auxv cwd loginuid ns root statm
cgroup environ maps numa_maps sched status
clear_refs exe mem oom_adj schedstat syscall
cmdline fd mountinfo oom_score sessionid task
comm fdinfo mounts oom_score_adj smaps wchan
[[email protected] 3606]#
[[email protected] 3606]# ll
总用量 0
dr-xr-xr-x. 2 root root 0 6月 24 19:49 attr #属性
-rw-r--r--. 1 root root 0 6月 24 19:50 autogroup
-r--------. 1 root root 0 6月 24 19:50 auxv
-r--r--r--. 1 root root 0 6月 24 19:50 cgroup
--w-------. 1 root root 0 6月 24 19:50 clear_refs
-r--r--r--. 1 root root 0 6月 24 19:49 cmdline#此进程执行的命令
-rw-r--r--. 1 root root 0 6月 24 19:50 comm
-rw-r--r--. 1 root root 0 6月 24 19:50 coredump_filter
-r--r--r--. 1 root root 0 6月 24 19:50 cpuset
lrwxrwxrwx. 1 root root 0 6月 24 19:50 cwd -> /root
-r--------. 1 root root 0 6月 24 19:50 environ#环境变量
lrwxrwxrwx. 1 root root 0 6月 24 19:50 exe -> /usr/bin/passwd
dr-x------. 2 root root 0 6月 24 19:49 fd#文件描述符相关信息
dr-x------. 2 root root 0 6月 24 19:50 fdinfo
-r--------. 1 root root 0 6月 24 19:50 io
-rw-------. 1 root root 0 6月 24 19:50 limits
-rw-r--r--. 1 root root 0 6月 24 19:50 loginuid
-r--r--r--. 1 root root 0 6月 24 19:50 maps
-rw-------. 1 root root 0 6月 24 19:50 mem
-r--r--r--. 1 root root 0 6月 24 19:50 mountinfo
-r--r--r--. 1 root root 0 6月 24 19:50 mounts
-r--------. 1 root root 0 6月 24 19:50 mountstats
dr-xr-xr-x. 6 root root 0 6月 24 19:50 net
dr-x--x--x. 2 root root 0 6月 24 19:50 ns
-r--r--r--. 1 root root 0 6月 24 19:50 numa_maps
-rw-r--r--. 1 root root 0 6月 24 19:50 oom_adj
-r--r--r--. 1 root root 0 6月 24 19:50 oom_score
-rw-r--r--. 1 root root 0 6月 24 19:50 oom_score_adj
-r--r--r--. 1 root root 0 6月 24 19:50 pagemap
-r--r--r--. 1 root root 0 6月 24 19:50 personality
lrwxrwxrwx. 1 root root 0 6月 24 19:50 root -> /
-rw-r--r--. 1 root root 0 6月 24 19:50 sched
-r--r--r--. 1 root root 0 6月 24 19:50 schedstat
-r--r--r--. 1 root root 0 6月 24 19:50 sessionid
-r--r--r--. 1 root root 0 6月 24 19:50 smaps
-r--r--r--. 1 root root 0 6月 24 19:50 stack
-r--r--r--. 1 root root 0 6月 24 19:48 stat
-r--r--r--. 1 root root 0 6月 24 19:50 statm
-r--r--r--. 1 root root 0 6月 24 19:48 status
-r--r--r--. 1 root root 0 6月 24 19:50 syscall
dr-xr-xr-x. 3 root root 0 6月 24 19:50 task
-r--r--r--. 1 root root 0 6月 24 19:50 wchan
[[email protected] 3606]#
[[email protected] fd]# ll
总用量 0
lrwx------. 1 root root 64 6月 24 19:49 0 -> /dev/pts/0 #输出到第一个终端
lrwx------. 1 root root 64 6月 24 19:49 1 -> /dev/pts/0
lrwx------. 1 root root 64 6月 24 19:49 2 -> /dev/pts/0
lrwx------. 1 root root 64 6月 24 19:49 3 -> socket:[34114] #调用的api
[[email protected] fd]#
文件描述符限制:
因为文件描述符是系统的一个重要资源,一般来说系统有多少内存就可以打开多少的文件描述符,但是实际系统内核还是会做一些限制的,正常情况下一个系统最大打开文件数是内存的10%左右,我们也叫系统级限制,可以通过以下命令查看
同时,系统内核为了不让某一个单独进程消耗掉所有的文件资源,它对单个的进程可以打开的最大文件数也做了限制,我们叫它用户级限制
[[email protected] fd]# sysctl -a |grep fs.file-max#最大可以占用46396,相当于总内存的%10
fs.file-max = 46396
[[email protected] fd]# free
total used free shared buffers
Mem: 494224 486948 7276 0 100636
-/+ buffers/cache: 327680 166544
Swap: 2031608 3672 2027936
[[email protected] fd]#
输入输出标准说明
STDIN 标准输入 默认的设备是键盘 文件编号为:0
命令将从标准输入文件中读取在执行过程中需要输入的数据,数据来源于文件,
STDOUT 标准输出 默认的设备是显示器 文件编号为:1
命令执行后的输出结果,发送到标准输出文件,结果输出到文件
STDERR 标准错误 默认的设备是显示器 文件编号为:2
命令将执行期间的各种错误信息发送到标准错误文件,错误信息发送到文件
标准输入,标准输出和标准错误默认使用键盘和显示器作为关联设备与操作系统进行交互完成最基本的输入,输出操作.
重定向输出
定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上
重定向输出使用”>” “>>” 操作符号
屏幕显示的内容(123) >> 新的文件 (a.txt)
1> 覆盖文件内容
>> 追加内容
若重定向的输出的文件不存在,则会新建该文件
标准输入
1.查看当前主机的CPU的类型保存到kernel.txt文件中(而不是直接显示到屏幕上)
[[email protected] ~]# cat /proc/cpuinfo > kernel.txt
[[email protected] ~]# ls
anaconda-ks.cfg install.log.syslog 公共的 文档
apache-tomcat-7.0.77 jdk-7u80-linux-x64.tar.gz 模板 下载
apache-tomcat-7.0.77.tar.gz kernel.txt 视频 音乐
install.log vmware-tools-distrib 图片 桌面
[[email protected] ~]# cat kernel.txt #查看cpu信息
processor: 0
vendor_id: GenuineIntel
cpu family: 6
model: 78
model name: Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
stepping: 3
cpu MHz: 2592.002
cache size: 4096 KB
fpu: yes
fpu_exception: yes
cpuid level: 22
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch ida arat pln pts dts fsgsbase smep
bogomips: 5184.00
clflush size: 64
cache_alignment: 64
address sizes: 40 bits physical, 48 bits virtual
power management:
[[email protected] ~]#
注:如果是错误信息他会直接显示出来,只有正确信息才会保存的文件中
[[email protected] ~]# cat /proc/123 > a.txt #默认>的左边是1
cat: /proc/123: 没有那个文件或目录 #错误信息,没有这个文件或目录
[[email protected] ~]# ls
anaconda-ks.cfg install.log.syslog 模板 音乐
apache-tomcat-7.0.77 jdk-7u80-linux-x64.tar.gz 视频 桌面
apache-tomcat-7.0.77.tar.gz kernel.txt 图片
a.txt vmware-tools-distrib 文档
install.log 公共的 下载
[[email protected] ~]# cat a.txt
[[email protected] ~]#
2.将内核的版本信息追加到kernel.txt
[[email protected] ~]# uname -r #查看内核版本信息
2.6.32-431.el6.x86_64
[[email protected] ~]# uname -r >> kernel.txt #将内核版本信息追加到kernel.txt文件中
[[email protected] ~]# cat !$ #查看kernel.txt文件
cat kernel.txt
processor: 0
vendor_id: GenuineIntel
cpu family: 6
model: 78
model name: Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
stepping: 3
cpu MHz: 2592.002
cache size: 4096 KB
fpu: yes
fpu_exception: yes
cpuid level: 22
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch ida arat pln pts dts fsgsbase smep
bogomips: 5184.00
clflush size: 64
cache_alignment: 64
address sizes: 40 bits physical, 48 bits virtual
power management:
2.6.32-431.el6.x86_64
[[email protected] ~]#
重定向输入
将命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入
从文件读取数据 操作符: “ < ” 等价于 0<
<< 表示结束输入的内容,常用来配合eof使用
好处:通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成
1.过滤出/etc/passwd中所有有关root的相关信息
[[email protected] ~]# grep root < /etc/passwd #将/etc/passwd中所有信息导入,前者是过滤root信息,后者即为输入
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# grep root /etc/passwd #过滤出/etc/passwd中所有有关root的相关信息
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]#
2.在脚本中我们可以通过重定向来打印消息菜单
[[email protected] ~]# cat a.sh
#!/bin/bash
cat <<eof
________________________________________
1.mysql
2.php
3.puppet
________________________________________
eof
[[email protected] ~]# sh a.sh
________________________________________
1.mysql
2.php
3.puppet
________________________________________
[[email protected] ~]#
3.mysql的数据导入
[[email protected] ~]# mysql –uroot –p123456 < worepree.sql
错误重定向
将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件,而不是直接显示到显示器
作用:错误信息保存到文件
操作符: 使用2>
2指的是错误文件的编号 (在使用标准的输入和输出省略了1、0 编号)
在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁
1.查找adfasdf 文件,如果报错,不显示在终端界面上,而是写入b.txt文件
[[email protected] ~]# grep root adfasdf 2>b.txt
[[email protected] ~]# echo $?
2
[[email protected] ~]# cat b.txt
grep: adfasdf: 没有那个文件或目录
[[email protected] ~]#
注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符
=======================================
从哪输出信息 (通过命令等) > 输出到哪个地方 (文件等)
输出到哪个地方grep root < 从哪输出信息 /etc/passwd
========================================
输入一个 > 会造成文件内容覆盖
输入二个 >> 是属于追加,不会覆盖原有文件内容
========================================
null黑洞
把/dev/null看作"黑洞". 它等价于一个只写文件。所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而 /dev/null对命令行和脚本都非常的有用.
1.查看当前目录下是否有asdfasdfwer文件,如果没有把错误信息移到/dev/null
[[email protected] ~]# ls asdfasdfwer 2> /dev/null
[[email protected] ~]# echo $?
2
[[email protected] ~]# ls asdfasdfwer
ls: 无法访问asdfasdfwer: 没有那个文件或目录
[[email protected] ~]#
2.将/etc/hosts文件内容复制到当前目录下的a.txt文件中
[[email protected] ~]# dd if=/etc/host
host.conf hosts hosts.allow hosts.deny
[[email protected] ~]# dd if=/etc/hosts of=a.txt #或者dd < /etc/host > a.txt
记录了0+1 的读入
记录了0+1 的写出
158字节(158 B)已复制,0.000265443 秒,595 kB/秒
[[email protected] ~]# du -sh a.txt
4.0Ka.txt
[[email protected] ~]# cat !$
cat a.txt
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[[email protected] ~]#
[[email protected] ~]# diff /etc/hosts ./a.txt #对比两个文件的差别
[[email protected] ~]#
[[email protected] ~]#
3.新建一个10M的文件,命名为file.txt
[[email protected] ~]#
[[email protected] ~]# dd if=/dev/zero of=file.txt bs=1M count=10 #从/dev/zero 中复制10M到file.txt文件
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.061904 秒,169 MB/秒
[[email protected] ~]# echo $? #查看上一条命令的返回值,如果为0则为真,如果为1等数字则为假
0
[[email protected] ~]# ls #查看是否生成file.txt文件
anaconda-ks.cfg a.txt install.log.syslog 公共的 文档
apache-tomcat-7.0.77 b.txt jdk-7u80-linux-x64.tar.gz 模板 下载
apache-tomcat-7.0.77.tar.gz file.txt kernel.txt 视频 音乐
a.sh install.log vmware-tools-distrib 图片 桌面
[[email protected] ~]# du -sh file.txt #查看file.txt文件的大小
10Mfile.txt
[[email protected] ~]#
特殊符号
输出到不同文件
正确的写到一个文件,错误的再写到一个文件
1.查找当前目录是否有asdfasdfqwer文件,如果有将正确的写到abc.txt 文件里,如果出现错误信息请输入到def.txt文件中
[[email protected] ~]# ls sadfasdfasdf > abc.txt 2>def.txt
[[email protected] ~]# ls
abc.txt a.txt install.log.syslog 模板 音乐
anaconda-ks.cfg b.txt jdk-7u80-linux-x64.tar.gz 视频 桌面
apache-tomcat-7.0.77 def.txt kernel.txt 图片
apache-tomcat-7.0.77.tar.gz file.txt vmware-tools-distrib 文档
a.sh install.log 公共的 下载
[[email protected] ~]# cat abc.txt
[[email protected] ~]# cat def.txt
ls: 无法访问sadfasdfasdf: 没有那个文件或目录
[[email protected] ~]#
&>符号
&> 混合输出 & :表示等同于的意思
个人描述:
1>&2 将正确的输出和错误的输出,一起输出到一个文件
2>&1 将错误的输出和正确的输出,一起输出到一个文件
官方描述:
1>&2 意思是把标准输出重定向到标准错误
2>&1 意思是把标准错误输出重定向到标准输出
把正确和错误的信息都输入到相同的位置
&> filename 意思是把标准输出和标准错误输出都重定向到文件filename中
1.将正确的输出和错误的输出,一起输出到一个文件abc.txt文件
[[email protected] ~]# ls asdfasdf /root > abc.txt 2>&1
[[email protected] ~]# cat abc.txt
ls: 无法访问asdfasdf: 没有那个文件或目录
/root:
abc.txt
anaconda-ks.cfg
apache-tomcat-7.0.77
apache-tomcat-7.0.77.tar.gz
a.sh
a.txt
b.txt
def.txt
file.txt
install.log
install.log.syslog
jdk-7u80-linux-x64.tar.gz
kernel.txt
vmware-tools-distrib
公共的
模板
视频
图片
文档
下载
音乐
桌面
[[email protected] ~]#
2.将错误的输出和正确的输出,一起输出到一个文件abcd.txt文件
[[email protected] ~]# ls asdfasdfasd /root/ 2> abcd.txt 1>&2
[[email protected] ~]# cat abcd.txt
ls: 无法访问asdfasdfasd: 没有那个文件或目录
/root/:
abcd.txt
abc.txt
anaconda-ks.cfg
apache-tomcat-7.0.77
apache-tomcat-7.0.77.tar.gz
a.sh
install.log
install.log.syslog
jdk-7u80-linux-x64.tar.gz
vmware-tools-distrib
公共的
模板
视频
图片
文档
下载
音乐
桌面
[[email protected] ~]#
3.将正确和错误输出都输出到qwer.txt文件里
[[email protected] ~]# ls asdfasdfasd /root/ &> qwer.txt
[[email protected] ~]# cat !$
cat qwer.txt
ls: 无法访问asdfasdfasd: 没有那个文件或目录
/root/:
abcd.txt
abc.txt
anaconda-ks.cfg
apache-tomcat-7.0.77
apache-tomcat-7.0.77.tar.gz
a.sh
install.log
install.log.syslog
jdk-7u80-linux-x64.tar.gz
qwer.txt
vmware-tools-distrib
公共的
模板
视频
图片
文档
下载
音乐
桌面
[[email protected] ~]#
管道 |
语法:command-a | command-b | command-c | ......
注意:
1、管道命令只处理前一个命令正确输出,不处理错误输出
2、管道命令右边命令,必须能够接收标准输入的数据流命令才行
3、管道符可以把两条命令连起来,它可以链接多个命令使用
1.查看root用户一共占用多少进程
[[email protected] ~]# ps aux | grep root | wc -l
148
[[email protected] ~]#
2.查看/etc/passwd 文件中的每一行
加上xargs,它表示把前面的内容的数据流转换为一个个命令参数,然后传给ls使用
[[email protected] ~]# cat /etc/passwd | xargs ls
ls: 无法访问root:x:0:0:root:/root:/bin/bash: 没有那个文件或目录
ls: 无法访问bin:x:1:1:bin:/bin:/sbin/nologin: 没有那个文件或目录
ls: 无法访问daemon:x:2:2:daemon:/sbin:/sbin/nologin: 没有那个文件或目录
ls: 无法访问adm:x:3:4:adm:/var/adm:/sbin/nologin: 没有那个文件或目录
ls: 无法访问lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin: 没有那个文件或目录
ls: 无法访问sync:x:5:0:sync:/sbin:/bin/sync: 没有那个文件或目录
ls: 无法访问shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown: 没有那个文件或目录
ls: 无法访问halt:x:7:0:halt:/sbin:/sbin/halt: 没有那个文件或目录
ls: 无法访问mail:x:8:12:mail:/var/spool/mail:/sbin/nologin: 没有那个文件或目录
ls: 无法访问uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin: 没有那个文件或目录
ls: 无法访问operator:x:11:0:operator:/root:/sbin/nologin: 没有那个文件或目录
ls: 无法访问games:x:12:100:games:/usr/games:/sbin/nologin: 没有那个文件或目录
ls: 无法访问gopher:x:13:30:gopher:/var/gopher:/sbin/nologin: 没有那个文件或目录
ls: 无法访问ftp:x:14:50:FTP: 没有那个文件或目录
ls: 无法访问User:/var/ftp:/sbin/nologin: 没有那个文件或目录
ls: 无法访问nobody:x:99:99:Nobody:/:/sbin/nologin: 没有那个文件或目录
ls: 无法访问dbus:x:81:81:System: 没有那个文件或目录
.....................
3.查找当前目录下所有以txt为后缀的文件全部删除
[[email protected] ~]# find ./ -name "*.txt" | xargs rm -rf
[[email protected] ~]# echo $?
0
[[email protected] ~]# ls
anaconda-ks.cfg install.log.syslog 模板 音乐
apache-tomcat-7.0.77 jdk-7u80-linux-x64.tar.gz 视频 桌面
apache-tomcat-7.0.77.tar.gz nohup.out 图片
a.sh vmware-tools-distrib 文档
install.log 公共的 下载
[[email protected] ~]#
管道与重定向的区别
管道
左边的命令应该有标准输出 | 右边的命令应该接受标准输入
管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行
管道两边都必须是shell命令
重定向
左边的命令应该有标准输出 > 右边只能是文件(可以是普通文件、文件描述符、设备文件)
左边的命令应该需要标准输入 < 右边只能是文件
tee命令
功能:读取标准输入的数据,并将其内容输出成文件。
语法:tee [-a][--help][--version][文件...]
参数:
-a或 --append 追加
--help 在线帮助
--version 显示版本信息
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
1.查看当前目录下权限为644(rw-,r--,r--的文件或目录信息写入到abc文件中并最终输出前10行文件或目录信息
[[email protected] ~]# find ./ -depth -perm 644 | tee abc | head -10
./apache-tomcat-7.0.77.tar.gz
./.local/share/gvfs-metadata/home-092f4bd9.log
./.local/share/.converted-launchers
./.local/share/applications/preferred-web-browser.desktop
./.local/share/applications/preferred-mail-reader.desktop
./install.log
./.imsettings.log
./.bashrc
./jdk-7u80-linux-x64.tar.gz
./.bash_profile
[[email protected] ~]# cat abc | wc -l
69
[[email protected] ~]#