重定向——逻辑运算符——管道

13 篇文章 0 订阅

cat 与重定向详解-CSDN博客 

目录

一.重定向

> 操作符

>> 操作符

二.标准输入、输出和错误

三.逻辑运算符

&& 运算符

|| 运算符

! 运算符

四.管道符 |

管道符的用法

组合多个管道

使用管道符进行统计和分析

管道符和重定向

注意事项

扩展命令:

sort

xargs

tee 


一.重定向

  1. > 操作符

    • 这是一个重定向符号,用于将标准输出 (或其他文件描述符) 写入到一个特定的目标中,通常是一个文件。
    • 如果目标文件已经存在,>覆盖这个文件的内容。
    • 示例:
      echo "这是一个测试" > output.txt
      上面的命令会创建(如果不存在)或覆盖 output.txt 文件,并将 "这是一个测试" 写入该文件。
  2. >> 操作符

    • 这是一个追加操作符,用于将标准输出 (或其他文件描述符) 追加到一个目标中,通常是一个文件。
    • 如果目标文件已经存在,>> 会将输出追加到文件末尾,而不会覆盖其原有内容。
    • 示例:
      echo "这是另一个测试" >> output.txt
      上面的命令会将 "这是另一个测试" 追加到 output.txt 文件末尾。如果文件不存在,则会创建它。在实践中,> 用于覆盖现有内容,>> 用于追加内容。

二.标准输入、输出和错误

  • 标准输入 (STDIN):文件描述符 0,通常指向键盘。程序通常从标准输入读取数据。
  • 标准输出 (STDOUT):文件描述符 1,通常指向屏幕。程序的正常输出一般发送到标准输出。
  • 标准错误 (STDERR):文件描述符 2,通常指向屏幕。程序的错误信息通常发送到标准错误。
  • 3+ 的文件描述符:在 Unix/Linux 系统中,文件描述符 3 及以上的编号用于进程在执行过程中打开的其他文件或资源,如网络套接字、文件、管道等。(了解即可)
  • 混合输出 & 是一种引用文件描述符的方式,用于指定重定向目标。
0标准输入
1标准输出
2标准错误
3+ 进程在执行过程中打开的其他文件。(大于等于3的数字)
&混合输出

例:

  1. 重定向标准输出

    echo "Hello, world!" > output.txt # 覆盖文件 
    echo "Append this." >> output.txt # 追加到文件
    
    # > 会将 "Hello, world!" 输出到 output.txt,如果文件存在,将覆盖其内容。
    # >> 会将 "Append this." 追加到 output.txt,不会覆盖原有内容。
    
    当重定向操作符 > 或 >> 不加数字时,默认表示标准输出,即文件描述符 1,两者是等效的
    # 重定向标准输出
    echo "Hello, world!" > output.txt
    # 明确指定重定向文件描述符 1
    echo "Hello, world!" 1> output.txt
    
    echo "Appending this." >> output.txt
    echo "Appending this." 1>> output.txt
    
  2. 重定向标准输入

    while read line; do echo $line done < input.txt
    # < input.txt 表示将 input.txt 的内容作为标准输入。
  3. 重定向标准错误

    command_that_might_fail 2> error.log # 覆盖 
    command_that_might_fail 2>> error.log # 追加
    # 2> 将命令的标准错误输出到 error.log,覆盖文件。
    # 2>> 将错误输出追加到 error.log。
  4. 将标准错误重定向到标准输出

    command_with_errors > all_output.log 2>&1
    # > all_output.log 将标准输出重定向到 all_output.log。
    # 2>&1 将标准错误重定向到标准输出的地方,这样标准输出和错误一起记录在 all_output.log 中。
  5. 忽略所有输出

    command_that_might_fail > /dev/null 2>&1
    # > /dev/null 丢弃标准输出。
    # 2>&1 将标准错误也重定向到 /dev/null,有效地忽略了所有输出。
  6.  将标准输出和标准错误重定向到同一文件
# 将标准输出和标准错误都重定向到 output.log
some_command &> output.log

      7.将标准输出和标准错误输出到同一个变量 

# 将标准输出和标准错误都存储在变量中
output=$(third_command &> /dev/null)

&>2>&1 类似,但语法更简洁,直接指示 shell 将标准输出和标准错误都重定向到指定的目标。这种操作符在处理大量输出时非常有用,可以简化代码。 

      8.将标准错误重定向到标准输出

# 将标准输出和标准错误都输出到同一个文件中
some_command > combined_output.log 2>&1

这会将 some_command 的标准输出和标准错误都写入 combined_output.log。
这个方法非常常用,以确保所有输出都记录在一起。

      9.将标准错误追加到标准输出

# 将标准输出追加到一个文件,然后将标准错误追加到相同的文件 
another_command >> combined_output.log 2>> combined_output.log

这个方法确保标准输出和标准错误都被追加到 combined_output.log,但它们仍然是分开的操作。

      10.只输出标准错误

# 将标准输出丢弃,仅保留标准错误 
yet_another_command > /dev/null 2>> error_output.log

这个例子丢弃标准输出 (> /dev/null),但将标准错误追加到 error_output.log。
这可以用于仅关注错误信息。

三.逻辑运算符

&& 运算符

  • 逻辑 AND:前一个命令成功(即退出状态码为 0),后一个命令才会执行。
  • 常用于条件执行。

示例

# 仅当 ls 成功时,才打印文件列表成功 
#如果 ls 执行成功,输出 "文件列表成功"。
#如果 ls 失败,后面的 echo 不会执行。
ls && echo "文件列表成功"



# 检查文件是否存在,然后删除 
#如果 testfile.txt 存在,删除文件。
#如果不存在,删除命令不会执行。
[ -f "testfile.txt" ] && rm testfile.txt

|| 运算符

  • 逻辑 OR:前一个命令失败(即退出状态码非 0),后一个命令才会执行。
  • 常用于错误处理和替代操作。

示例

# 如果 ls 失败,显示错误信息 
#如果 ls 在无效目录上失败,输出 "无法列出目录"。
#如果 ls 成功,echo 不会执行。
ls invalid_directory || echo "无法列出目录"


# 如果文件不存在,则创建
#如果 newfile.txt 不存在,创建文件。
#如果存在,不执行任何操作。
[ -f "newfile.txt" ] || touch newfile.txt

! 运算符

  • 逻辑 NOT:用于取反一个条件。
  • 常用于反转条件或检查某个命令的失败。

示例

# 如果 testfile.txt 不存在,创建它 
#取反 -f "testfile.txt" 的结果。
#如果 testfile.txt 不存在,创建文件。
if ! [ -f "testfile.txt" ]; then 
    touch testfile.txt 
fi


# 如果 ls 失败,输出 "命令失败"     ! 运算符也可以通过 $? 检查命令的退出状态。
ls invalid_directory if [ $? -ne 0 ]; 
    then echo "命令失败" 
fi

四.管道符 |

管道符 (|) 是 Unix/Linux 系统中用于将一个命令的输出传递给另一个命令作为输入的符号。它是命令行和 shell 脚本中非常常用的工具,允许你将多个命令链接在一起,形成数据处理管道。

管道符的用法

最基本的用法是将一个命令的输出传递给另一个命令。例如,以下命令将 ls -l 的输出传递给 grep,以查找包含 "txt" 的行:

ls -l | grep "txt"

在这个例子中,ls -l 列出当前目录的详细信息,然后 grep 从中筛选出包含 "txt" 的行。

组合多个管道

管道符可以串联多个命令,形成更复杂的数据处理流程。例如,以下命令组合了 ps, grep, 和 awk,来查找运行的进程并提取特定的列:

ps aux | grep "bash" | awk '{print $1, $2}'

这里,ps aux 列出所有进程,grep "bash" 筛选出与 "bash" 相关的进程,然后 awk 提取进程所有者和进程 ID。

使用管道符进行统计和分析

管道符可以用于统计数据,例如统计当前目录中包含特定字符的文件数量:

ls | grep "log" | wc -l

这个命令统计当前目录中包含 "log" 的文件数量,wc -l 用于计算行数。

管道符和重定向

管道符通常与重定向结合使用,以将输出发送到文件或其他地方。例如,将 ls -l 的输出通过管道传递给 tee,同时显示输出并保存到文件:

ls -l | tee output.txt

这个命令显示 ls -l 的输出,并将其保存到 output.txt。

注意事项

  • 错误处理:管道符只能传递标准输出,而不能传递标准错误。要处理标准错误,可能需要 2>&1 或类似重定向。
  • 不改变原始数据:管道符不会改变原始数据,它只是将数据从一个命令传递到另一个命令。
  • 性能:长管道链可能会影响性能,尽量使用精简的命令链。

扩展命令:

sort

sort用于对输入数据进行排序

  • -n:按数值顺序排序。例如,对数字列表进行排序。
  • -r:反转排序顺序,得到降序结果。
  • -u:只保留唯一的行,移除重复行。
  • -k:指定按哪个字段排序。
  • -t:指定字段分隔符。

例:

[root@localhost ~]# sort -t":" -k3 -n /etc/passwd  #以: 分隔,将第三列按字数升序
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd -r #以: 分隔,将第三列按字数降序
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd |head #以: 分隔,将第三列按字数升序看前十行
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd |tail #以: 分隔,将第三列按字数升序看后十行

========================================================================= 

xargs

用于将标准输入转换为命令行参数。它在处理复杂的命令行输入、将输出传递给另一个命令或执行批处理操作时用。管道对:ls cp rm  不能执行。所以通过xargs。

  • -I {}:指定占位符,将输入的每一行替换为 {},然后执行命令。
  • -i :为了让大括号生效
  • -r : 目录时需要加-r
  • -n N:指定每次使用多少个参数执行命令。
  • -t:在执行命令之前打印出命令的内容("trace" 方式)。
  • -d <delimiter>:指定输入的分隔符。
  • -p:交互式确认,在执行每个命令之前提示确认。

#批量删除文件 # 删除当前目录中以 ".tmp" 结尾的所有文件
ls *.tmp | xargs rm
#在这个例子中,xargs 将 ls 的输出转换为 rm 的参数,实现批量删除。

#按行处理文件 # 将多个文件按行拼接输出
echo -e "file1.txt\nfile2.txt" | xargs cat
#这里,xargs 将两个文件名作为 cat 命令的参数,并将它们的内容拼接输出。

#使用占位符 # 将文件名作为参数传递,进行操作
echo -e "file1.txt\nfile2.txt" | xargs -I {} mv {} /backup/
#使用 -I {} 指定 {} 为占位符,允许在命令中替换为输入的每一行。

#限制参数数量 # 每次使用两个参数执行命令
echo -e "file1.txt\nfile2.txt\nfile3.txt\nfile4.txt" | xargs -n 2
#使用 -n 2 限制每次传递给命令的参数数量。在这个例子中,每次 xargs 只使用两个文件名。

#使用自定义分隔符 # 使用 ":" 作为分隔符,处理不同的输入
echo "word1:word2:word3" | xargs -d ':' echo
#通过 -d ':' 指定 : 为分隔符,允许拆分输入并作为参数传递给命令。

#交互式确认 # 在删除文件之前,要求确认
ls *.tmp | xargs -p rm
#使用 -p 在执行每个命令之前进行交互式确认,增加安全性。

#将输出传递给另一个命令 # 将 ps 的输出传递给 grep,然后传递给 xargs
ps aux | grep "bash" | awk '{print $2}' | xargs kill
#在这个例子中,xargs 接收 awk 的输出并传递给 kill,实现批量杀死进程。

#生成备份  # 备份多个文件
ls *.txt | xargs -I {} cp {} {}.bak
#使用 xargs -I {} 生成备份文件,将每个文件复制并添加 .bak 后缀。

#使用 echo 查看命令  # 查看即将执行的命令,用于调试
echo -e "file1.txt\nfile2.txt" | xargs -t cat
#使用 -t 来显示 xargs 即将执行的命令,用于调试和追踪。

tee 

tee 是“T”形管道的一种比喻,因为它将数据分流到两个方向。

  • -a:追加模式。默认情况下,tee 会覆盖目标文件,使用 -a 可以将输出追加到文件末尾。
  • -i:忽略中断信号(SIGINT)。在某些情况下,可能需要防止中断信号干扰 tee 的执行。
#将输出保存到多个文件
# 将输入同时输出到标准输出和多个文件
echo "Hello, Multi!" | tee output1.txt output2.txt
#tee 可以同时输出到多个文件,传递给命令的所有文件名都会得到输出。

#追加到文件
# 追加模式,不覆盖原有内容
echo "Another line" | tee -a output.txt
#在这个例子中,tee -a 追加到 output.txt,不会覆盖原有内容。

#与其他命令结合使用
# 将 ls 输出既输出到标准输出,又保存到文件
ls | tee output.txt
#tee 常与其他命令结合,通过管道符 | 传递数据。

#忽略中断信号
# 忽略中断信号,防止意外终止
echo "Some content" | tee -i output.txt
#-i 参数用于忽略中断信号,确保 tee 不会因为信号而中断。

应用场景

  • 日志记录:同时查看命令的输出并保存到文件。
  • 调试和测试:在运行过程中将输出保存,以便后续分析。
  • 文件备份:同时写入多个文件,用于备份和冗余。
  • 35
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值