一、重定向
标准输入、标准正确输入、标准错误输出
0,标准输入(键盘)
1,标准输出
2,标准错误,
3+,进程在执行过程中打开的其他文件。
&:表示正确错误混合输出
正确输出: 1>和1>> ,可简写为 >和>>
错误输出: 2>和2>> 没有简写
二、输出重定向(覆盖追加 > ,>> )
----覆盖
----追加
正确输出: 1> 1>> 等价于 > >>
错误输出: 2> 2>>
1、输出重定向
覆盖
[root@qfedu.com ~]# date 1> date.txt #正确输出--覆盖
# 注意:如果 > 前面什么都不加默认为1,标准正确输出。
追加
[root@qfedu.com ~]# date >> date.txt #正确输出--追加
错误输出重定向
并将错误输出重定向到不同的位置
[root@qfedu.com ~]# ls /home/ /aaaaaaaaa >list.txt
ls: cannot access /aaaaaaaaa: No such file or directory
[root@qfedu.com ~]# ls /home/ /aaaaaaaaa >list.txt 2>error.txt #将错误输出重定向到不同的位置
[root@qfedu.com ~]# cat error.txt
ls: cannot access /aaaaaaaaa: No such file or directory
正确和错误都输入到相同位置
[root@qfedu.com ~]# ls /home/ /aaaaaaaaa &>list.txt #混合输出到相同文件
将错误输出重定向到空设备 /dve/null (垃圾桶)
[root@qfedu.com ~]# ls /home/ /aaaaaaaaa >list.txt 2>/dev/null #空设备,将错误的输出丢掉
[root@qfedu.com ~]# ls /home/ /aaaaaaaaa &>/dev/null #空设备,将正确与错误的输出丢掉
echo 命令
echo会将输入的内容送往标准输出写入(打印)
echo 内容 >> 文件名或脚本里面
echo $? #查看上一条命令是否执行成功
输入重定向 <
标准输入: < 等价 0<
我们可以让命令从文件中获取,这样本来的命令需要从标准输入stdin中获取,转换为从我们的指定文件中获取。这样本来需要从键盘输入的命令就会转移到文件读取内容。语法如下:
command1 < file
通过输入重定向创建文件
(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
管道(piping) |
管道是将上一个命令的结果重定向到下一个命令
进程管道
语法:command(命令)1 | command2 |command3 |…
管道命令可以将多条命令组合起来,一次性完成复杂的处理任务。
命令1执行完后会有一些标准的输出信息会经过管道收集起来作为下一个命令的标准输入,直到完成最后一个指令进行输出到屏幕当中(管道左侧的输出,就是右侧的输入)
tee(三通)管道
三通管道,即交给另一个程序处理,又保存一份副本
示例:
命令解释:
查看进程过滤出root字段的进程,然后通过三通管道tee 把得到的信息存储进gdtest.txt文件中,记续过滤出含有1250的进程
完成后查看gdtest.txt 因为文件中内容过多 我们只显示其中的前十行用作演示。
[root@localhost ~]# ps aux |grep root|tee gdtest.txt |grep 1250
root 1250 0.0 0.4 481488 4724 ? Ssl 16:41 0:00 /usr/sbin/gdm
root 4188 0.0 0.0 112728 972 pts/1 S+ 19:57 0:00 grep --color=auto 1250
[root@localhost ~]# tail -10 gdtest.txt
root 2638 0.0 0.0 0 0 ? S 17:40 0:00 [kworker/u256:1]
root 3906 0.0 0.6 163616 6048 ? Ss 19:36 0:00 sshd: a [priv]
root 3974 0.0 0.0 0 0 ? S 19:39 0:00 [kworker/0:0]
root 4106 0.0 0.0 0 0 ? S 19:50 0:00 [kworker/0:3]
root 4150 0.0 0.0 0 0 ? S 19:55 0:00 [kworker/0:1]
root 4182 0.0 0.0 107956 616 ? S 19:57 0:00 sleep 60
root 4185 0.0 0.1 155372 1872 pts/1 R+ 19:57 0:00 ps aux
root 4186 0.0 0.0 112732 964 pts/1 R+ 19:57 0:00 grep --color=auto root
root 4187 0.0 0.0 108172 676 pts/1 S+ 19:57 0:00 tee gdtest.txt
root 4188 0.0 0.0 112728 972 pts/1 S+ 19:57 0:00 grep --color=auto 1250
[root@localhost ~]#
参数传递:xargs
对:ls cp rm 管道不能执行。所以通过 xargs 参数。
语法:
第一种:查看文件,并复制文件到别的目录
cat a.txt | xargs -i cp {} /目录
{}:前面传过来的内容
-i :为了让大括号生效
解释:前面传过来的东西交给大括号
查看文件内容,
cat file.txt |xargs ls -l
前面是目录或者目录的路径。 ls - l 后面可以不加大括号,直接执行。
第二种:查看文件,并复制目录及目录当中的文件,到别的目录
[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’
xargs的参数:
{}:前面传过来的内容
-i :为了让大括号生效
cp的参数:
当想知道命令后所跟的参数,可以使用man 、--help
-f : --暴力,如果无法打开现有的目标文件,请删除并重试(当-n选项也被使用)
-r : 同-R,--递归,递归复制目录