Linux学习 重定向 管道 流

server/2024/9/25 9:17:03/
  1. 重定向 管道 流

    在 Linux 中一个命令的去向可以有 3 个地方:终端、文件、作为另外一个命令的入参。

    而命令一般都是通过键盘输入,然后输出到终端、文件等地方,它的标准用语是 stdin 、 stdout 以及 stderr 。

    标准输入stdin,终端接收键盘输入的命令,会产生两种输出;

    标准输出stdout,终端输出的信息(不包含错误信息);

    标准错误输出stderr ,终端输出的错误信息。

    1. 重定向

      把本来要显示在终端的命令结果,输送到别的地方(到文件中或者作为其他命令的输入)。

    2. 输出重定向 >
      >表示重定向到新的文件,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

      这样做的好处是,当我们在启动某项服务或者查询大量信息室,在终端中展示起来很麻烦我们就可以使用重定向到文件的方法,来记录这样大量的信息.

      【注意】使用>要注意,如果输出的文件不存在它会新建一个,如果输出的文件已经存在,则会覆盖。因此执行这个操作要非常小心,以免覆盖其它重要文件。

    3. 输出重定向 >>

      表示重定向到文件末尾,因此它不会像 > 命令这么危险,它是追加到文件的末尾(当然如果文件不存在,也会被创建)。

      # 这里也可以看出 这个重定向命令是会先去创建文件夹,再去输出
      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

      当我们每次启动一个服务时,不希望之前服务运行的日志被覆盖掉就可以使用这个重定向到文件尾的方式.

    4. 输出重定向 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
      
    5. 输出重定向 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
      

      目前为止,我们接触的命令的输入都来自命令的参数,其实命令的输入还可以来自文件或者键盘的输入。

    6. 输入重定向 <

      <符号用于指定命令的输入。cat < res.txt # 指定命令的输入为 res.txt 
      

      虽然它的运行结果与cat name.csv一样,但是它们的原理却完全不同。

      cat res.txt表示cat命令接收的输入是res.txt文件名,那么要先打开这个文件,然后打印出文件内容。

      cat < res.txt 表示cat命令接收的输入直接是res.txt这个文件的内容,cat命令只负责将其内容打印,打开文件并将文件内容传递给 cat命令的工作则交给终端完成。

    7. 输入重定向 <<

      将键盘的输入重定向为某个命令的输入。

    8. 管道|

      把两个命令连起来使用,一个命令的输出作为另外一个命令的输入,英文是 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

http://www.ppmy.cn/server/121751.html

相关文章

Ansible 自动化运维工具的使用

1 说明 1.1 Ansible简介 ansible是一种流行的自动化运维工具,基于python2-paramiko模块开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令功能。 ansible是基于模块工作的,本身没有批量部署的能力…

python-list-append-method

Python 列表追加()方法 原文:https://www.geeksforgeeks.org/python-list-append-method/ Python List 追加() 方法用于在列表的末尾追加和添加元素。 **语法:**列表.追加(项) 参数: **项:**列表末尾要添加的项 返回: 该方法不返回值 示例 1:向列表中添加项目 计算机编程语言 …

vulnhub-prime1

目录 靶场环境解题过程 靶场环境 项目ip靶机&#xff08;prime&#xff09;未知攻击机&#xff08;kali&#xff09;10.128.129.128 解题过程 打开靶机&#xff0c;我们只能看见一个登录界面&#xff0c;上面只有半截提示 我们首先要做的是主机发现&#xff0c;因为是网络适…

.NET IIS发布项目后设置虚拟路径访问文件 404

解决方案: 找到Startup.cs中适当配置静态文件中间件&#xff1a; 确保调用了UseStaticFiles中间件 public void Configure(IApplicationBuilder app) {app.UseStaticFiles(); // 确保这行在UseRouting之前app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoin…

从Profinet到Ethernet IP网关技术重塑工业网络,数据传输更流畅

Profinet转Ethernet IP网关在未来工业领域可能产生以下重要影响并发挥关键作用&#xff1a;促进工业设备集成与互操作性&#xff1a;打破协议壁垒&#xff1a;在工业场景中&#xff0c;存在多种不同的工业以太网协议&#xff0c;设备往往因协议差异而难以直接通信。 Profinet转…

WebAssembly (Wasm) 与 JavaScript 字符串交互

随着WebAssembly&#xff08;简称Wasm&#xff09;技术的发展&#xff0c;越来越多的Web应用开始利用Wasm来提高性能。Wasm是一种在现代Web浏览器中运行的二进制格式&#xff0c;可以提供接近原生代码的速度。然而&#xff0c;Wasm和JavaScript之间进行数据交换时需要特别注意&…

随笔 程序运行的基本原理

程序是如何运行&#xff0c;又是如何崩溃的&#xff1f; 正如标题所言&#xff0c;今天我们来聊聊程序是如何执行的&#xff1f;以及又是如何崩溃的&#xff1f;我们哼哧哼哧写的代码并不是程序&#xff0c;本质上不过是一个文本文件。即便我们将我们写的代码通过编译生成的可…

NPM如何切换淘宝镜像进行加速

什么是淘宝镜像NPM&#xff1f; 淘宝镜像NPM和官方NPM的主要区别在于服务器的地理位置和网络访问速度。淘宝镜像NPM是由淘宝团队维护的一个npm镜像源&#xff0c;主要服务于中国大陆用户&#xff0c;提供了一个国内的npm镜像源&#xff0c;地址为 https://registry.npmmirror.…