重定向是指工作人员在执行一个脚本文件时将执行结果放到文件夹中,而不是显示在终端,这个过程就叫重定向,重定向包括标准输入,标准正确输出,标准错误输出。
一、输出重定向
输出重定向包括覆盖跟追加两种方式,覆盖是指将文件中的内容全部删除,只保留新输出的内容,追加是指在原来的文件内容后面增加输出内容,不更改文件原来内容。
> #覆盖
>> #追加
#举例
date #终端显示当前时间
date > a.txt #将输出结果保存到a.txt文件中,终端不显示运行结果
cat a.txt #查看文件内容,里面是date运行结果,重定向成功
hwclock #终端显示当前时间
hwclock >> a.txt #将显示结果追加到文件a.txt中
cat a.txt #显示date与hwclock执行结果
hwclock > a.txt #将显示结果添加到文件a.txt中,覆盖之前的内容
cat a.txt #只显示hwclock运行结果
1、错误输出重定向
错误输出重定向是指将执行的报错结果保存到文件中,不保存正确结果。
2> #错误输出重定向
举例
ls /home/aaaaaaaaa/ #查看根目录下home目录下的aaaaaaaaa目录下的文件,home目录下没有此目录
ls /home/aaaaaaaaa/ 2> b.txt #将报错内容重定向到文件b.txt中
ls /home/ /aaaaaaaaa/ >a.txt 2> b.txt #将正确输出重定向到a.txt中,错误输出重定向到b.txt中
cat b.txt #查看报错内容
2、混合重定向
混合重定向是指将正确跟错误的输出结果都保存到文件中
&> #混合重定向
ls /home/ /aaaaaaaaa/ &> c.txt 将正确跟错误的输出都保存到c.txt中
空设备:重定向的意义在于将正确的跟错误的输出分开,方便我们进行浏览,但是错误的输出是我们不需要的,此时就需要用到linux系统中自带的空设备,也叫黑洞文件/dev/null,将内容丢到这个文件中,永远不会填满,适合处理我们不需要的内容
ls /home/ /aaaaaaaaa >a.txt 2>/dev/null #空设备,将错误的输出丢掉,正确输出保留在文件a.txt中
脚本中使用重定向
实战一(没有使用重定向)
[root@qfedu.com ~]# vim ping1.sh
#!/bin/bash
ping -c1 10.18.40.100
if [ $? -eq 0 ];then
echo "10.18.40.100 is up."
else
echo "10.18.40.100 is down!"
fi
[root@qfedu.com ~]# chmod +x ping1.sh
[root@qfedu.com ~]# ./ping1.sh #执行文件(执行脚本)
PING 10.18.40.100 (10.18.40.100) 56(84) bytes of data.
--- 10.18.40.100 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
10.18.40.100 is down!
实战二(使用重定向)
[root@qfedu.com ~]# vim ping1.sh
#!/bin/bash
ping -c1 10.18.40.100 &>/dev/null
if [ $? -eq 0 ];then
echo "10.18.40.100 is up." >>up.txt
else
echo "10.18.40.100 is down!"
fi
[root@qfedu.com ~]# ./ping1.sh
二、输入重定向
通过输入重定向创建文件
(cat > file <<EOF )是用来创建文件或者在脚本中使用,并向文件中输入信息输入的任何东西会被写入文件中,EOF命令结束。 语法:cat > file5 <<EOF #可以写到脚本或者文件里面 EOF:开始和结束的标记。 成对使用 结尾的另一个必须顶格写。
实战案例一:
[root@qfedu.com ~]# cat > file4 <<EOF
> 111
> 222
> 333
> 444
> EOF
[root@qfedu.com ~]# cat file4
111
222
333
444
实战案例二
利用重定向建立多行的文件 脚本创建多行文件
[root@qfedu.com ~]# vim create_file.sh
#!/bin/bash
cat >file200.txt <<EOF
111
222
333
yyy
ccc
EOF
[root@qfedu.com ~]# chmod +x create_file.sh
[root@qfedu.com ~]# ./create_file.sh
[root@qfedu.com ~]# cat file200.txt
111
222
333
yyy
ccc
管道
管道是用来同时运行两个或多个命令的,将命令组合使用会提高效率,减少工作量。
rpm -qa |grep 'httpd' #查询所有安装的软件包,只保留包含httpd的包
ps aux | grep 'sshd' #查询所有进程,只保留sshd的进程
参数传递:xargs
对与ls cp rm命令,管道不能执行。所以通过xargs。 语法: cat a.txt | xargs -i cp {} /目录 {}:前面传过来的内容 -i :为了让大括号生效 目录时 -r 解释:前面传过来的东西交给大括号 cat file.txt |xargs ls -l 前面是目录或者目录的路径。 ls -l 后面可以不加大括号,直接执行。
实战案例一
[root@qfedu.com ~]# touch /home/file{1..5}
[root@qfedu.com ~]# vim files.txt
/home/file1
/home/file2
/home/file3
/home/file4
/home/file5
[root@qfedu.com ~]# cat files.txt |ls -l #不加xargs传参,看输出结果
[root@qfedu.com ~]# cat files.txt |rm -rvf #不加xargs传参,看输出结果
[root@qfedu.com ~]# cat files.txt |xargs ls -l
-rw-r--rwx. 1 root root 12 Nov 7 21:57 /home/file1
-rw-r--r--. 1 root root 0 Nov 7 21:57 /home/file2
-rw-r--r--. 1 root root 0 Nov 7 21:57 /home/file3
-rw-r--r--. 1 root root 0 Nov 7 21:57 /home/file4
-rw-r--r--. 1 root root 0 Nov 7 21:57 /home/file5
[root@qfedu.com ~]# cat files.txt |xargs rm -rvf
removed ‘/home/file1’
removed ‘/home/file2’
removed ‘/home/file3’
removed ‘/home/file4’
removed ‘/home/file5’
实战案例二
[root@qfedu.com ~]# touch /home/file{1..5}
[root@qfedu.com ~]# # cat files.txt | xargs -i cp -rvf {} /tmp/
‘/home/file1’ -> ‘/tmp/file1’
‘/home/file2’ -> ‘/tmp/file2’
‘/home/file3’ -> ‘/tmp/file3’
‘/home/file4’ -> ‘/tmp/file4’
‘/home/file5’ -> ‘/tmp/file5’