最稳妥常用的方式是用 while read -r 配合输入重定向,关键在 -r 和 IFS= 组合以保留原始行格式;该方法按换行符分隔、禁用反斜杠转义,兼容性好且语义清晰。

最稳妥、最常用的方式是用 while read -r 配合输入重定向,同时注意保留原始行格式(比如多余空格、制表符)——关键在 -r 和 IFS= 的组合使用。
用 while read -r 逐行读取(推荐)
这是 Shell 中最可靠、兼容性最好、语义最清晰的方法。它天然按换行符分隔,且 -r 参数能禁用反斜杠转义,避免意外截断或解析错误。
- 基本写法:
while read -r line; do echo "处理:$line"; done - 若文件含前后空格、中间多个空格或制表符,需防止被
read自动裁剪:
加IFS=(空值)可禁用字段分割,让整行原样进变量:while IFS= read -r line; do echo "$line"; done - 想把文件路径作为参数传入脚本?这样写:
file="$1"; while IFS= read -r line; do process "$line"; done
用 awk 按行处理(简洁高效)
awk 本质就是为文本行/列处理设计的,语法短、内置变量丰富,适合做格式化、提取、计算等操作。
- 直接打印每行:
awk '{print $0}' file.txt或简写为awk '1' file.txt - 带条件和格式化:
awk '{printf "【%d】%s\n", NR, $0}' file.txt(加行号) - 只处理含关键词的行:
awk '/error/ {print "ERR:", $0}' file.txt - 按列拆分再重组:
awk '{print $3, $1}' file.txt(交换第3列和第1列)
避免 for 循环直接读文件(易出错)
for line in $(cat file.txt) 看似简单,但默认以空白字符(空格、制表符、换行符)切分,会导致一行内容被拆成多段,原始结构彻底丢失。
- 除非你明确要“按词”而非“按行”处理,否则不建议用这种写法
- 真要用 for,必须先改
IFS:IFS=$'\n'; for line in $(cat file.txt); do echo "$line"; done; IFS=' '
但绕来绕去,不如直接用while read
处理时保留原始格式的小技巧
有些场景要求严格还原每一行(比如拼接命令、生成配置、传给其他程序),光靠 read 还不够:
- 结尾换行符会被
read自动剥离,如需保留,可用mapfile或while IFS= read -r line; do printf '%s\n' "$line"; done(printf不自动加换行) - 空行会被跳过?不会 ——
read能正确读取空行,只要别漏掉-r和IFS= - 文件末尾无换行符?
read仍能读到最后一行,只是退出状态为 1,不影响处理

















