Linux 逐行读取文件详解
在 Linux 环境中,逐行读取文件是脚本编写和数据处理中最常见的需求,根据不同的应用场景(如简单显示、复杂逻辑处理或高性能需求),可以选择不同的实现方式。
使用 Shell 脚本的 while 循环(最常用)
这是在 Bash 脚本中处理文件的标准方法,适用于需要对每一行执行特定逻辑的场景。
标准写法:
while IFS= read -r line; do
echo "当前行内容: $line"
done < "file.txt"
关键参数解析:
IFS=:将内部字段分隔符(Internal Field Separator)设置为空,这样可以防止行首和行尾的空格或制表符被自动删除。read -r:-r参数防止反斜杠被当作转义字符处理,确保读取到的是原始文本。
< "file.txt":将文件内容重定向输入到while循环中。
使用 awk 处理(高效处理)
awk 是一种强大的文本处理语言,它默认就是逐行读取并处理的,速度比 while 循环快得多。
- 打印每一行:
awk '{print $0}' file.txt - 根据条件读取并处理:
# 仅打印包含 "Error" 关键字的行 awk '/Error/ {print "发现错误: " $0}' file.txt - 处理特定列:
# 打印每行的第一列 awk '{print $1}' file.txt
使用 sed 处理(流编辑器)
sed 适用于对文件的每一行进行替换、删除或特定行提取。
-
逐行打印(等同于 cat):
sed -n 'p' file.txt
- 读取并替换每行中的字符串:
# 将每行中的 "old" 替换为 "new" sed 's/old/new/g' file.txt
使用 Python 实现(复杂逻辑)
当读取逻辑过于复杂(如需要调用 API、进行复杂的数学运算)时,建议使用 Python。
推荐写法:
with open('file.txt', 'r', encoding='utf-8') as f:
for line in f:
# .strip() 用于去除行尾的换行符 n
print(line.strip())
- 优点:内存效率高(迭代器模式),不会一次性将大文件加载到内存中。
方案对比与选择指南
根据你的需求选择最合适的工具:
- 简单逻辑/系统管理脚本 $rightarrow$ 使用
。while read - 大规模文本过滤/字段提取 $rightarrow$ 使用
awk。 - 快速文本替换/行删除 $rightarrow$ 使用
sed。 - 复杂业务逻辑/数据分析 $rightarrow$ 使用 Python。
常见陷阱提示
- 大文件处理:避免使用
for line in $(cat file.txt),因为这会将整个文件加载到内存中,且在遇到空格时会将一行拆分成多个元素,导致结果错误且内存溢出。 - 权限问题:确保执行读取操作的用户对目标文件具有
r(read) 权限。 - 换行符问题:如果文件来自 Windows(CRLF),建议先使用
dos2unix file.txt转换,否则read命令可能会在行尾留下不可见的r字符。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/488044.html



