Ruby中masscan_progress变量为何呈现两种不同输出?求指点
问题根源
\r(回车符)是终端控制字符,它只会把光标拉回行首,不会换行。你直接查看变量时,终端会解析这个字符——每遇到一个\r,后面的内容就会覆盖掉前面的,所以视觉上只看到最后一段进度,但变量里其实存着所有带\r的历史进度内容。而puts(不同语言实现逻辑不同)可能会把\r当成换行或者直接截断到最后一段,导致只输出最后一行有效内容。
解决办法
根据你的需求选对应的处理方式:
1. 只拿最新的进度内容
如果不需要历史进度,直接提取最后一段即可:
# 删掉最后一个\r之前的所有内容,只留最新进度 latest_progress="${masscan_progress##*$'\r'}" # 验证输出 echo "$latest_progress"
这里$'\r'是shell里表示回车符的写法,##*是shell参数替换的语法,意思是从变量开头删到最后一个\r的位置。
2. 保留所有历史进度
要是需要把所有历史进度都展示出来,把\r换成换行符\n就行:
# 替换变量里所有\r为\n full_progress="${masscan_progress//$'\r'/\\n}" # 或者直接输出时替换 echo "$masscan_progress" | tr '\r' '\n'
处理完之后所有进度会按行排列,后续用grep之类的搜索命令就能正常匹配内容。
3. 从源头避免问题
既然你是用tail -n1抓的进度,说明masscan是用\r来实时刷新行内容的,不如直接在获取变量时就处理掉\r:
# 抓最后一行的同时把\r换成\n masscan_progress=$(tail -n1 command 2>/dev/null | tr '\r' '\n')
这样变量里就不会有烦人的\r,后续操作不用再额外处理。
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

