在 Linux 和 Unix 系统中,重定向和管道是两个非常重要的功能,用于控制命令的输入、输出和处理数据流。通过重定向和管道,可以将命令的输出保存到文件、作为另一个命令的输入,或进行更复杂的数据处理。
重定向命令
重定向用于将命令的标准输入(stdin
)、标准输出(stdout
)或标准错误输出(stderr
)重定向到文件或其他设备。
重定向符号
符号 |
描述 |
> |
将标准输出(stdout )重定向到文件,覆盖文件内容。 |
>> |
将标准输出(stdout )重定向到文件,追加到文件末尾。 |
< |
将文件的内容作为标准输入(stdin )。 |
2> |
将标准错误输出(stderr )重定向到文件,覆盖文件内容。 |
2>> |
将标准错误输出(stderr )重定向到文件,追加到文件末尾。 |
&> |
将标准输出和标准错误(stdout 和 stderr )同时重定向到文件,覆盖内容。 |
&>> |
将标准输出和标准错误(stdout 和 stderr )同时重定向到文件,追加内容。 |
/dev/null |
丢弃输出或错误(相当于垃圾桶)。 |
重定向用法
将命令输出重定向到文件
1
| echo "Hello, World!" > output.txt
|
>
:将输出写入文件 output.txt
(覆盖文件内容)。
- 如果
output.txt
不存在,会自动创建。
将输出追加到文件
1
| echo "Another line" >> output.txt
|
>>
:将输出追加到 output.txt
的末尾。
将文件内容作为命令的输入
<
:将文件 input.txt
的内容作为 cat
命令的输入。
将错误输出重定向到文件
1
| ls non_existent_file 2> error.log
|
2>
:将错误输出保存到 error.log
文件中。
同时重定向标准输出和错误
1
| ls /etc > output.log 2>&1
|
2>&1
:将错误输出(stderr
)重定向到标准输出(stdout
),然后统一保存到 output.log
中。
丢弃输出
丢弃错误输出
1
| ls non_existent_file 2> /dev/null
|
丢弃所有输出
1
| ls /etc > /dev/null 2>&1
|
管道命令
管道(|
)用于将一个命令的输出作为另一个命令的输入。它是连接多个命令的重要工具。
管道的基本语法
command1
的输出通过管道传递给 command2
作为输入。
管道示例
将命令输出传递给另一个命令
ls -l
:列出目录的详细内容。
grep ".txt"
:过滤出包含 .txt
的行。
统计命令输出的行数
ls
:列出当前目录的文件。
wc -l
:统计文件列表的行数。
显示进程并过滤关键字
ps aux
:显示所有运行中的进程。
grep "nginx"
:过滤出包含 nginx
的进程。
排序和去重
1
| cat file.txt | sort | uniq
|
cat file.txt
:显示文件内容。
sort
:对文件内容排序。
uniq
:去重,显示唯一的行。
查找大文件并排序
du -h
:显示目录和文件的大小。
sort -h
:按人类可读格式(如 KB、MB 等)排序。
重定向与管道结合
重定向和管道可以结合使用,用于更复杂的数据处理。
示例 1:将输出保存到文件
1
| ls -l | grep ".txt" > txt_files.log
|
ls -l
:列出目录内容。
grep ".txt"
:过滤出包含 .txt
的文件。
>
:将结果保存到 txt_files.log
文件中。
示例 2:同时处理输出和错误
1
| find /etc -name "*.conf" > output.log 2>&1
|
find /etc -name "*.conf"
:查找 /etc
下的 .conf
文件。
>
:将输出保存到 output.log
。
2>&1
:将错误输出一起保存。
示例 3:统计错误行数
1
| ls /nonexistent 2>&1 | wc -l
|
ls /nonexistent
:尝试列出不存在的目录。
2>&1
:将错误输出通过管道传递。
wc -l
:统计错误消息的行数。
常见组合示例
示例 1:查找日志中的错误并保存
1
| grep "ERROR" /var/log/syslog | tee error_log.txt
|
grep "ERROR"
:查找日志中的错误行。
tee
:将输出写入文件,同时打印到屏幕。
示例 2:监控文件变化
1
| tail -f /var/log/syslog | grep "ERROR"
|
tail -f
:实时查看文件变化。
grep "ERROR"
:实时过滤包含 ERROR
的行。
示例 3:过滤并统计文件中出现最多的单词
1
| cat file.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr | head -10
|
tr -s ' ' '\n'
:将空格转换为换行符,将每个单词分行。
sort
:对单词排序。
uniq -c
:统计每个单词出现的次数。
sort -nr
:按数字降序排序。
head -10
:取出现次数最多的前 10 个单词。
总结
重定向符号
符号 |
作用 |
> |
标准输出重定向到文件(覆盖)。 |
>> |
标准输出重定向到文件(追加)。 |
< |
从文件读取输入。 |
2> |
错误输出重定向到文件(覆盖)。 |
2>> |
错误输出重定向到文件(追加)。 |
&> |
标准输出和错误同时重定向到文件。 |
/dev/null |
丢弃输出或错误。 |
管道符号
常用命令组合
- 筛选:
ps aux | grep "nginx"
- 统计:
ls | wc -l
- 排序:
cat file.txt | sort | uniq -c | sort -nr
通过灵活使用重定向和管道,可以大大提高 Linux 日常操作的效率和灵活性!