重定向丶管道丶参数传递

(1)重定向

重定向作用:输出到终端的信息可以输入到文件中,可以读取文件中内容输出到屏幕上
FD:file descriptors 文件描述符
进程使用文件描述符来管理打开的文件,标识进程使用pid
特殊的文件描述符:
	0			//标准输入,键盘,只读
	1			//标准输出,终端,只写
	2			//标准错误输出,终端,只写
	3+			//其它所有文件,可读可写
输出重定向:
	正确输出:
		1> 或>            \输出重定向,把前面输出的东西输入到后边的文件中,会清除文件原有内容
                1>>或>>           \输出重定向,把前面输出的东西输入到后边的文件中,会清除文件原有内容
	错误输出:
		2>	               \错误输出重定向,把错误信息输入到后边的文件中,会删除文件原有内容
                2>>                \错误输出追加重定向,把错误信息追加到后边的文件中,不会删除文件原有内容
输入重定向
	标准输入
		<或0<            \输入重定向,输入重定向用于改变命令的输入,后面指定输入内容,可以理解为把文件的内容输入到命令中进行处理
                0<<或<<          \追加输入重定向,后跟字符串,用来表示"输入结束",也可用ctrl+d来结束输入
案例:输出重定向
	date >date.txt				//输出重定向,覆盖原来文件内容
	date >>date.txt				//输出重定向,追加文件内容
	ls /home /adsfdasfad  >list.txt					//错误的不会输出到list.txt文件中
	ls /home /adsfdasfad  >list.txt 2>error.txt		//重定向到不同的位置
	ls /home /adfadfadsfads &>list.txt			//混合输出
	ls /home /adfadfadsfads >list.txt 2>&1		//重定向到相同的位置
	ls /home /adfadfadsfads	>list.txt 2>/dev/null	//错误信息输出到空设备
	ls /home /adfadfadsfads	&>/dev/null			//错误和正确输出都输出到空设备中
        >/tmp/file.txt                                //清空file.txt文件的内容
空设备:/dev/null 误操作删除恢复:
	mknod -m 666 /dev/null c 1 3 			//创建/dev/null文件,权限是666,设备类型是字符设备c,主设备号是1,次设备号是3
	设备文件和普通文件的区别是设备文件有主设备号和次设备号,字符文件c和块文件b的区别是块文件有缓存
案例:输入重定向
	mail -s "ssss" root 					//没有改变键盘输入,默认是键盘等待键盘输入
	mail -s "test" root </etc/hosts 		//输入重定向,来源于文件
	dd if=/dev/zero of=/tmp/file1.txt bs=1M count=10 
		dd </dev/zero >/tmp/file2.txt bs=1M count=10            //使用输入输出重定向创建文件,等同于上面的dd命令
	mysql -uroot -predhat <mysql.sql		//导入mysql
	at now +2 min < at.txt 					//2分钟后执行at.txt文件中的命令

(2)重定向高级使用

#案例:创建文件
#cat > file1.txt 
111
222
^D			//ctrl+d 结束
#案例:创建文件
#cat >> file1.txt       //注意和cat >file1.txt区别
111
222
^D			//ctrl+d 结束
#案例:创建文件
cat >file2<<EOF
111
222
EOF
#脚本打印菜单:
cat <<-EOF					//-表示结束符EOF如果前面遇到tab键也没关系会忽略tab键,如果遇到空格就没办法
111
222
EOF
#命令同时运行()
(ls;date) &>/dev/null 		//两条命令的执行结果都输出到垃圾桶中
(while true;do date;sleep 1;done) &>date.txt
(while true;do date;sleep 1;done) &>date.txt &
#子shell
cd /boot;ll 
(cd /boot;ll)			//这种方式是使用()是在子shell中运行命令,不会影响当前shell,如果不希望某些命令的执行对当前shell环境产生影响就使用子shell
(umask 777;touch file777.txt)
umask 

(3)管道 |

管道作用:把一个进程的输出结果重定向另外一个进程中;上一个命令的输出作为下一个命令的输入

案例1:将/etc/passwd中的用户按UID大小排序
sort :排序
	-t :指定字段分割符
	-k :指定列
	-n :按数值排序
	-r :逆序 
sort -t":" -n -k3 /etc/passwd
sort -t":" -nr -k3 /etc/passwd
sort -t":" -n -k3 /etc/passwd | head 
例2:统计出最占CPU的5个进程
ps aux --sort=-%cpu | head -6
例3:统计当前/etc/passwd中用户使用的shell类型
awk -F ":" '{print $NF}' /etc/passwd 
awk -F ":" '{print $NF}' /etc/passwd | sort 
awk -F ":" '{print $NF}' /etc/passwd | sort | uniq 
awk -F ":" '{print $NF}' /etc/passwd | sort | uniq -c
例4:统计网站的访问情况:统计ip top10
ss -an|grep  ":80" | awk -F"[ :]+" '{print $(NF-2)}' | sort| uniq -c | sort -k1 -nr| head
例5:打印当前所有ip
ip addr|grep "inet "| awk -F"[ /]+" '{print $3}'
例6:打印根分区已用空间的百分比
df -P | grep "/$"| awk '{print $(NF-1)}'

(4)管道tee

管道tee作用:把一个进程的输出结果重定向另外一个进程中同时可以重定向文件中;上一个命令的输出可以输出到文件中,也可以作为下一个命令的输入

例1:打印当前所有ip
ip addr|grep "inet "|tee ip.txt | awk -F"[ /]+" '{print $3}'

(5)参数传递:xargs

作用:它能够捕获一个命令的输出,然后传递给另外一个命令

例1:删除7天前的日志
find /usr/local/tomcat/logs  -type f -mtime +7  | xargs  rm -f
例2:获取/etc/目录下以.conf结尾的文件通过管道传送给ls -l命令作为该命令的参数
find /etc -name "*.conf" | xargs ls –l
例3:假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
cat url-list.txt | xargs wget –c
例4:查找所有的jpg 文件,并且压缩它
 find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
例5:递归查找所有Python文件并统计文件行数
find . -name '*.py' | xargs wc -l
注意:
如果文件或是目录名含有空格,则可能会有些问题,这是因为 xargs默认 会按照空白字符(包括 换号 和 table)来 划分输入。一个简单的解决办法就是告诉find使用NUL()来分割结果(通过向find提供-print0选项),并且告诉xargs也使用Nul来分隔输入(-0)
find ~ -name "*.log" -print0 | xargs -0 rm -rf
原文地址:https://www.cnblogs.com/lovelinux199075/p/9022213.html