📝 文件操作
大家好,我是长安!这一章来教大家一些高级的文件操作技巧,学会这些你就能像大神一样优雅地操作文件了。
🎯 本章目标
跟着长安读完这一章,你将掌握:
- 文件的创建、编辑、查看
- 文件的压缩与解压
- 文件内容处理技巧
- 重定向和管道的使用
✏️ 创建和编辑文件
创建空文件
# 使用 touch 创建空文件
touch newfile.txt
# 创建多个文件
touch file1.txt file2.txt file3.txt
# 使用大括号批量创建
touch test_{1..5}.txt
# 创建:test_1.txt, test_2.txt, test_3.txt, test_4.txt, test_5.txt
快速写入内容
# 使用 echo 写入一行
echo "Hello World" > hello.txt
# 追加内容(不覆盖)
echo "Another line" >> hello.txt
# 写入多行(使用 cat 和 EOF)
cat > myfile.txt << EOF
第一行
第二行
第三行
EOF
使用编辑器
# nano - 新手友好的编辑器
nano filename.txt
# vim - 强大但需要学习
vim filename.txt
# gedit - 图形界面编辑器(如果有桌面)
gedit filename.txt
💡 nano 快速入门
打开后直接输入内容,然后:
Ctrl + O:保存Ctrl + X:退出Ctrl + K:剪切当前行Ctrl + U:粘贴
👀 查看文件内容
基本查看
# 查看全部内容
cat file.txt
# 带行号查看
cat -n file.txt
# 分页查看(大文件)
less file.txt
more file.txt
# 查看前 N 行
head -n 20 file.txt
head -20 file.txt
# 查看后 N 行
tail -n 20 file.txt
tail -20 file.txt
# 实时监控文件
tail -f logfile.log
统计文件信息
# 统计行数、单词数、字符数
wc file.txt
# 输出:10 50 300 file.txt
# 含义:10行 50个单词 300个字符
# 只显示行数
wc -l file.txt
# 只显示单词数
wc -w file.txt
# 只显示字符数
wc -c file.txt
文件类型识别
# 识别文件类型
file document.pdf
# 输出:document.pdf: PDF document, version 1.4
file script.sh
# 输出:script.sh: Bourne-Again shell script, ASCII text
📦 压缩与解压
tar 命令
tar 是 Linux 最常用的打包/压缩工具。
# 常用参数:
# -c:创建(Create)
# -x:解压(eXtract)
# -v:显示过程(Verbose)
# -f:指定文件名(File)
# -z:用 gzip 压缩
# -j:用 bzip2 压缩
打包和压缩:
# 仅打包(不压缩)
tar -cvf archive.tar folder/
# 打包并用 gzip 压缩(最常用)
tar -czvf archive.tar.gz folder/
# 打包并用 bzip2 压缩(压缩率更高)
tar -cjvf archive.tar.bz2 folder/
解压:
# 解压 .tar 文件
tar -xvf archive.tar
# 解压 .tar.gz 文件
tar -xzvf archive.tar.gz
# 解压 .tar.bz2 文件
tar -xjvf archive.tar.bz2
# 解压到指定目录
tar -xzvf archive.tar.gz -C /tmp/
查看压缩包内容:
# 不解压,只查看内容
tar -tvf archive.tar.gz
💡 记忆技巧
想象你在"开坦克"(tank):
- 创建:
tar -czvf(Create,压缩装进坦克) - 解压:
tar -xzvf(eXtract,从坦克里拿出来)
-f 一定要放在最后,因为后面紧跟文件名!
zip/unzip 命令
处理 Windows 常见的 .zip 格式。
# 安装
sudo apt install zip unzip -y
# 压缩
zip -r archive.zip folder/
# 解压
unzip archive.zip
# 解压到指定目录
unzip archive.zip -d /tmp/
# 查看压缩包内容
unzip -l archive.zip
gzip/gunzip 命令
# 压缩单个文件(会删除原文件)
gzip file.txt
# 生成:file.txt.gz
# 解压
gunzip file.txt.gz
# 或
gzip -d file.txt.gz
# 保留原文件
gzip -k file.txt
🔀 重定向
重定向可以改变命令的输入/输出方向。
输出重定向
# > 覆盖写入文件
echo "Hello" > file.txt
# >> 追加到文件末尾
echo "World" >> file.txt
# 2> 重定向错误输出
ls /nonexistent 2> error.log
# &> 同时重定向标准输出和错误输出
command &> all.log
# 把输出丢到黑洞(不显示)
command > /dev/null 2>&1
输入重定向
# < 从文件读取输入
wc -l < file.txt
# << 使用 Here Document
cat << EOF > file.txt
这是第一行
这是第二行
EOF
文件描述符
| 描述符 | 名称 | 说明 |
|---|---|---|
| 0 | stdin | 标准输入(键盘) |
| 1 | stdout | 标准输出(屏幕) |
| 2 | stderr | 标准错误(屏幕) |
# 分别重定向输出和错误
command > output.log 2> error.log
# 错误输出重定向到标准输出
command 2>&1
🔗 管道
管道 | 可以把一个命令的输出作为另一个命令的输入。
# 查找包含 error 的行
cat log.txt | grep "error"
# 统计文件数量
ls | wc -l
# 查看进程并搜索
ps aux | grep nginx
# 排序并去重
cat names.txt | sort | uniq
# 分页查看长输出
cat bigfile.txt | less
管道链式操作
# 查找 /var/log 下最大的 5 个文件
du -sh /var/log/* 2>/dev/null | sort -hr | head -5
# 统计每种文件类型的数量
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn
# 查看系统中占用内存最多的 10 个进程
ps aux | sort -k4 -rn | head -10
🔍 文件内容处理
sort - 排序
# 按字母排序
sort file.txt
# 按数字排序
sort -n numbers.txt
# 倒序
sort -r file.txt
# 按第2列排序
sort -k2 file.txt
# 去除重复行后排序
sort -u file.txt
uniq - 去重
# 去除相邻的重复行(先要 sort)
sort file.txt | uniq
# 只显示重复的行
sort file.txt | uniq -d
# 统计每行出现次数
sort file.txt | uniq -c
cut - 截取列
# 截取第 1 列(以冒号分隔)
cut -d: -f1 /etc/passwd
# 截取第 1 和第 3 列
cut -d: -f1,3 /etc/passwd
# 截取字符位置 1-10
cut -c1-10 file.txt
tr - 字符转换
# 大写转小写
echo "HELLO" | tr 'A-Z' 'a-z'
# 删除所有数字
echo "abc123def" | tr -d '0-9'
# 压缩重复字符
echo "aaaaabbbcc" | tr -s 'a-z'
# 输出:abc
sed - 流编辑器
# 替换第一个匹配
sed 's/old/new/' file.txt
# 替换所有匹配
sed 's/old/new/g' file.txt
# 直接修改文件
sed -i 's/old/new/g' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除第 3 行
sed '3d' file.txt
# 只打印第 5 到 10 行
sed -n '5,10p' file.txt
awk - 文本处理神器
# 打印第 1 列
awk '{print $1}' file.txt
# 打印第 1 和第 3 列
awk '{print $1, $3}' file.txt
# 使用自定义分隔符
awk -F: '{print $1}' /etc/passwd
# 打印行号和内容
awk '{print NR, $0}' file.txt
# 求和
awk '{sum+=$1} END {print sum}' numbers.txt
# 条件过滤
awk '$3 > 100 {print $1}' data.txt
🔎 文件比较
diff - 比较文件差异
# 比较两个文件
diff file1.txt file2.txt
# 并排显示
diff -y file1.txt file2.txt
# 只显示不同的部分
diff -u file1.txt file2.txt
comm - 比较已排序的文件
# 比较两个排序过的文件
comm file1.txt file2.txt
📝 本章小结
| 操作 | 命令 | 示例 |
|---|---|---|
| 创建文件 | touch | touch file.txt |
| 写入内容 | echo > | echo "hi" > file.txt |
| 追加内容 | echo >> | echo "hi" >> file.txt |
| 压缩 | tar -czvf | tar -czvf a.tar.gz dir/ |
| 解压 | tar -xzvf | tar -xzvf a.tar.gz |
| 管道 | | | cat f.txt | grep x |
| 重定向 | > >> | cmd > output.txt |
| 排序 | sort | sort file.txt |
| 去重 | uniq | sort f.txt | uniq |
| 替换 | sed | sed 's/a/b/g' file |
💡 最有用的组合
# 查日志找错误
cat log.txt | grep -i error | tail -20
# 查进程
ps aux | grep nginx | grep -v grep
# 查磁盘占用
du -sh * | sort -hr | head -10
🚀 下一步
文件操作熟练了,接下来跟着长安学习 用户与权限,这可是 Linux 的核心概念!
—— 编程指南社区 · 长安
