如何修复script(1)工具输出的换行问题以适配lnav?
方向一:修改script(1)输出,把CR转成LF
方法1:用管道过滤输出
直接在script命令后加管道,用tr工具把所有CR字符替换成LF,彻底修正换行格式。修改原脚本里的script调用部分:
env TERM=dumb script -a -q /dev/stdout -c "$(cat <<- EOF lftp $PROTOCOL://$URL -u ${USER},${PASS} << EOFF set dns:fatal-timeout never set sftp:auto-confirm yes set mirror:use-pget-n 50 set mirror:parallel-transfer-count 2 set mirror:parallel-directories yes set mirror:include-regex $REGEX set log:enabled/xfer yes set log:file/xfer $LOG set xfer:use-temp-file yes set xfer:temp-file-name *.lftp mirror -c -v --loop --Remove-source-dirs "$REMOTEDIR" "$LOCALDIR" quit EOFF EOF )" | tr '\r' '\n' > $LOGSTDOUT
-q参数让script不输出多余的启动/结束提示信息- 把script的输出导向标准输出,再通过
tr '\r' '\n'替换所有CR为LF,最后写入日志文件
方法2:用script原生参数(部分系统支持)
GNU版本的script支持--output-lf参数,直接强制输出LF换行,无需额外过滤。如果你的系统是GNU环境,直接修改脚本:
env TERM=dumb script -a --output-lf $LOGSTDOUT -c "$(cat <<- EOF # 原lftp命令内容不变 EOF )"
先运行script --help检查是否支持该参数,BSD系统的script可能没有这个选项。
方向二:让lnav把CR当作LF处理
如果不想修改日志生成流程,可以给lnav添加自定义格式规则,让它将CR识别为换行符。
步骤1:创建自定义格式文件
在~/.config/lnav/formats/目录下创建script-cr-fix.json文件,内容如下:
{ "script_log": { "title": "Script Log with CR Line Endings", "description": "Fixes CR line endings from script(1)", "regex": { "line": "(?s)(.*?)(?:\\r|\\n|\\r\\n)" } } }
这个规则会匹配所有以CR、LF或CRLF结尾的行,将CR视为换行分隔符。
步骤2:加载格式并查看日志
启动lnav时指定加载该格式:
lnav -f ~/.config/lnav/formats/script-cr-fix.json $LOGSTDOUT
之后lnav就能正确解析日志中的CR换行,显示正常内容。
内容的提问来源于stack exchange,提问作者mwsmws22
相关产品推荐
相关产品推荐

