缩短日志文件中的长行

缩短日志文件中的长行

我保存程序输出的日志文件。问题是有时在转储很长的 7 位 ascii 数据行(编码二进制)时会发生错误,我不想保留。在到达换行符之前,这些行的长度可能超过 200KB。

什么可能是一个简短的、可管道的方式,例如。仅更改sed长度超过 250 个字符的行,方法是仅保留该行的前 80 个和最后 40 个字符,可能只用_

答案1

在 sed 中,所有命令都可以添加一个条件作为前缀,指示该命令应用于哪些行。一种常见的条件是搜索模式。搜索模式/.\{250\}/匹配包含超过 250 个字符的行。对于此类行,匹配前 80 个字符和后 40 个字符,并用前缀__和后缀替换整行。

sed -e '/.\{250\}/ s/^\(.\{80\}\).*\(.\{40\}\)$/\1__\2/'

您甚至可以安排替换命令的模式以仅匹配足够长的行。

sed -e 's/^\(.\{80\}\).\{130,\}\(.\{40\}\)$//'

答案2

我不太了解sed,所以我的解决方案是 awk:

awk 'length>250{len=length;$0=substr($0,1,80) "_" substr($0,len-40+1)};1' file

答案3

这是一个可以执行此操作的 awk 命令:

awk 'len=length{if(len>250){print substr($0,0,80),"__",substr($0,len-40,len)}else{print $0}}' data.txt

解释:

如果该行长度超过 250 个字符,则打印前 80 个字符,后跟字符串___然后是最后 40 个字符。

如果该行少于 250 个字符,只需打印出原始行。

答案4

有一种可管道化的方法可以使用 提取一行的前 80 个和后 40 个字符sed,但是sed没有“if 语句”,因此无法直接在 sed 中测试字符串长度,然后对其执行操作。

捕获前 80 个和后 40 个字符全部线条可以用 来完成| sed -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/'

sed -i -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/' logfile

将对文件执行就地修改,但仅限于在所有行上操作。

相关内容