Linux学习 重定向 管道 流
-
重定向 管道 流
在 Linux 中一个命令的去向可以有 3 个地方:终端、文件、作为另外一个命令的入参。
而命令一般都是通过键盘输入,然后输出到终端、文件等地方,它的标准用语是 stdin 、 stdout 以及 stderr 。
标准输入stdin,终端接收键盘输入的命令,会产生两种输出;
标准输出stdout,终端输出的信息(不包含错误信息);
标准错误输出stderr ,终端输出的错误信息。
-
重定向
把本来要显示在终端的命令结果,输送到别的地方(到文件中或者作为其他命令的输入)。
-
输出重定向 >
>
表示重定向到新的文件,root@hcss-ecs-c2b8:~# ll > /var/test/root_files.txt
,它表示将ll
命令列出的根目录下所有文件夹信息重定向到/var/test/root_files.txt
文件。root@hcss-ecs-c2b8:~# ll total 124 drwx------ 10 root root 4096 Sep 24 21:15 ./ drwxr-xr-x 24 root root 4096 Sep 20 00:12 ../ drwx------ 3 root root 4096 Jul 22 2023 .ansible/ drwxr-xr-x 2 root root 4096 Jul 22 2023 .ansible_async/ -rw-r--r-- 1 root root 8925 Sep 23 23:45 .bash_history -rw-r--r-- 1 root root 3144 Jul 22 2023 .bashrc drwx------ 2 root root 4096 Feb 10 2023 .cache/ drwxr-xr-x 7 root root 4096 Jul 22 2023 docker-library/ -rw-r--r-- 1 root root 21926 Jul 22 2023 get-docker.sh -rw-r--r-- 1 root root 1326 Jul 21 2023 githubclone.sh -rw------- 1 root root 0 Feb 10 2023 .history -rwxr-xr-x 1 root root 15353 Jul 22 2023 HSSInstall* drwxr-xr-x 8 root root 4096 Jul 22 2023 library/ -rw-r--r-- 1 root root 161 Jul 9 2019 .profile drwx------ 4 root root 4096 Jul 22 2023 snap/ drwx------ 2 root root 4096 Sep 19 23:43 .ssh/ drwxr-xr-x 9 root root 4096 Jul 22 2023 stackhub/ -rw------- 1 root root 10517 Sep 23 23:23 .viminfo -rw-r--r-- 1 root root 173 Jul 22 2023 .wget-hsts -rw------- 1 root root 118 Sep 24 21:15 .Xauthority # 将上述目录重定向到一个文本文件中 root@hcss-ecs-c2b8:~# ll > /var/test/root_files.txt root@hcss-ecs-c2b8:~# cat /var/test/root_files.txt total 124 drwx------ 10 root root 4096 Sep 24 21:15 ./ drwxr-xr-x 24 root root 4096 Sep 20 00:12 ../ drwx------ 3 root root 4096 Jul 22 2023 .ansible/ drwxr-xr-x 2 root root 4096 Jul 22 2023 .ansible_async/ -rw-r--r-- 1 root root 8925 Sep 23 23:45 .bash_history -rw-r--r-- 1 root root 3144 Jul 22 2023 .bashrc drwx------ 2 root root 4096 Feb 10 2023 .cache/ drwxr-xr-x 7 root root 4096 Jul 22 2023 docker-library/ -rw-r--r-- 1 root root 21926 Jul 22 2023 get-docker.sh -rw-r--r-- 1 root root 1326 Jul 21 2023 githubclone.sh -rw------- 1 root root 0 Feb 10 2023 .history -rwxr-xr-x 1 root root 15353 Jul 22 2023 HSSInstall* drwxr-xr-x 8 root root 4096 Jul 22 2023 library/ -rw-r--r-- 1 root root 161 Jul 9 2019 .profile drwx------ 4 root root 4096 Jul 22 2023 snap/ drwx------ 2 root root 4096 Sep 19 23:43 .ssh/ drwxr-xr-x 9 root root 4096 Jul 22 2023 stackhub/ -rw------- 1 root root 10517 Sep 23 23:23 .viminfo -rw-r--r-- 1 root root 173 Jul 22 2023 .wget-hsts -rw------- 1 root root 118 Sep 24 21:15 .Xauthority
这样做的好处是,当我们在启动某项服务或者查询大量信息室,在终端中展示起来很麻烦我们就可以使用重定向到文件的方法,来记录这样大量的信息.
【注意】使用
>
要注意,如果输出的文件不存在它会新建一个,如果输出的文件已经存在,则会覆盖。因此执行这个操作要非常小心,以免覆盖其它重要文件。 -
输出重定向
>>
表示重定向到文件末尾,因此它不会像 > 命令这么危险,它是追加到文件的末尾(当然如果文件不存在,也会被创建)。
# 这里也可以看出 这个重定向命令是会先去创建文件夹,再去输出 root@hcss-ecs-c2b8:/var/test# ll > files.txt root@hcss-ecs-c2b8:/var/test# cat files.txt total 28 drwxr-xr-x 3 root root 4096 Sep 24 21:24 ./ drwxr-xr-x 14 root root 4096 Sep 21 08:28 ../ -rwxr-xr-x 1 root root 628 Sep 23 23:23 compose_file.sh* drwxr-xr-x 2 root root 4096 Sep 23 23:25 dir1/ -rwxr-xr-x 1 root root 473 Sep 22 10:07 file_move.sh* -rw-r--r-- 1 root root 0 Sep 24 21:24 files.txt -rw-r--r-- 1 root root 1071 Sep 24 21:16 root_files.txt -rw-r--r-- 1 root root 987 Sep 23 23:24 test.tar.gz # 这里当我们使用>>时,就是进行追加写入了,没有将之前的覆盖掉 root@hcss-ecs-c2b8:/var/test# ll >> files.txt root@hcss-ecs-c2b8:/var/test# cat files.txt total 28 drwxr-xr-x 3 root root 4096 Sep 24 21:24 ./ drwxr-xr-x 14 root root 4096 Sep 21 08:28 ../ -rwxr-xr-x 1 root root 628 Sep 23 23:23 compose_file.sh* drwxr-xr-x 2 root root 4096 Sep 23 23:25 dir1/ -rwxr-xr-x 1 root root 473 Sep 22 10:07 file_move.sh* -rw-r--r-- 1 root root 0 Sep 24 21:24 files.txt -rw-r--r-- 1 root root 1071 Sep 24 21:16 root_files.txt -rw-r--r-- 1 root root 987 Sep 23 23:24 test.tar.gz total 32 drwxr-xr-x 3 root root 4096 Sep 24 21:24 ./ drwxr-xr-x 14 root root 4096 Sep 21 08:28 ../ -rwxr-xr-x 1 root root 628 Sep 23 23:23 compose_file.sh* drwxr-xr-x 2 root root 4096 Sep 23 23:25 dir1/ -rwxr-xr-x 1 root root 473 Sep 22 10:07 file_move.sh* -rw-r--r-- 1 root root 426 Sep 24 21:24 files.txt -rw-r--r-- 1 root root 1071 Sep 24 21:16 root_files.txt -rw-r--r-- 1 root root 987 Sep 23 23:24 test.tar.gz
当我们每次启动一个服务时,不希望之前服务运行的日志被覆盖掉就可以使用这个重定向到文件尾的方式.
-
输出重定向
2> 和 2>>
刚刚提到过,有两种输出方式,这里介绍第二种,标准错误输出
当我们输入的命令有无,或者报错的时候,如下
root@hcss-ecs-c2b8:/var/test# 1 1: command not found root@hcss-ecs-c2b8:/var/test# not_exist_command not_exist_command: command not found root@hcss-ecs-c2b8:/var/test# ll -asda asdasd ls: cannot access 'asdasd': No such file or directory root@hcss-ecs-c2b8:/var/test#
输入错误命令的下一行都会有对应的报错,这个就是标准错误输出
当我们编写的脚本或者服务出现问题时,我们希望能苟将其记录进一个错误日志error.log的文件之中,我们这样这样来做
# 查看一个不存在的目录 root@hcss-ecs-c2b8:/var/test# ll not_exist_dir 2>error.log root@hcss-ecs-c2b8:/var/test# cat error.log ls: cannot access 'qweq': No such file or directory root@hcss-ecs-c2b8:/var/test# ll not_exist_dir 2>>error.log root@hcss-ecs-c2b8:/var/test# ll not_exist_dir 2>>error.log root@hcss-ecs-c2b8:/var/test# cat error.log ls: cannot access 'not_exist_dir': No such file or directory ls: cannot access 'not_exist_dir': No such file or directory
-
输出重定向
2>&1
标准输出和标准错误输出都重定向都一个地方,注意这个无论是追加还是覆盖都只有一个>符号,由标准输出的符号决定输出方式
# 用cat命令打开一个不存在的文件 root@hcss-ecs-c2b8:/var/test# cat not_exit_file > res.txt 2>&1 root@hcss-ecs-c2b8:/var/test# cat res.txt cat: not_exit_file: No such file or directory root@hcss-ecs-c2b8:/var/test# cat not_exit_file > res.txt 2>&1 root@hcss-ecs-c2b8:/var/test# cat res.txt cat: not_exit_file: No such file or directory root@hcss-ecs-c2b8:/var/test# cat not_exit_file >> res.txt 2>&1 root@hcss-ecs-c2b8:/var/test# cat res.txt cat: not_exit_file: No such file or directory cat: not_exit_file: No such file or directory
目前为止,我们接触的命令的输入都来自命令的参数,其实命令的输入还可以来自文件或者键盘的输入。
-
输入重定向
<
<符号用于指定命令的输入。 cat < res.txt # 指定命令的输入为 res.txt
虽然它的运行结果与cat name.csv一样,但是它们的原理却完全不同。
cat res.txt表示cat命令接收的输入是res.txt文件名,那么要先打开这个文件,然后打印出文件内容。
cat < res.txt 表示cat命令接收的输入直接是res.txt这个文件的内容,cat命令只负责将其内容打印,打开文件并将文件内容传递给 cat命令的工作则交给终端完成。
-
输入重定向
<<
将键盘的输入重定向为某个命令的输入。
-
管道
|
把两个命令连起来使用,一个命令的输出作为另外一个命令的输入,英文是
pipeline
,可以想象一个个水管连接起来,管道算是重定向流的一种。这里举个简单的例子
root@hcss-ecs-c2b8:/var/test# ll | grep -E "*.txt" -rw-r--r-- 1 root root 1278 Sep 24 21:25 files.txt -rw-r--r-- 1 root root 117 Sep 24 21:33 file.txt -rw-r--r-- 1 root root 92 Sep 24 21:53 res.txt -rw-r--r-- 1 root root 1071 Sep 24 21:16 root_files.txt -rw-r--r-- 1 root root 681 Sep 24 22:06 sort.txt # 这里管道符将ll命令的输出作为grep命令的输入并将grep命令的输出重定向到txt_type_files.text文件中 root@hcss-ecs-c2b8:/var/test# ll | grep -E "*.txt" > txt_type_files.text root@hcss-ecs-c2b8:/var/test# cat txt_type_files.text -rw-r--r-- 1 root root 1278 Sep 24 21:25 files.txt -rw-r--r-- 1 root root 117 Sep 24 21:33 file.txt -rw-r--r-- 1 root root 92 Sep 24 21:53 res.txt -rw-r--r-- 1 root root 1071 Sep 24 21:16 root_files.txt -rw-r--r-- 1 root root 681 Sep 24 22:06 sort.txt -rw-r--r-- 1 root root 0 Sep 24 22:10 txt_type_files.text
-