如何使用剪切打印文本文件的特定行

如何使用剪切打印文本文件的特定行

我有日志输出的下一个片段:

Server Server: Server
Date and Time: June 04 2018 14:10:00
--

Product     Version         User         Host             IP             Duration

Software1      11.0     user               user         *.**.***.***     10:08
Software2      11.0      user                user        *.**.***.***     10:05
===================================================================================

我想要与命令仅过滤输出,例如:

Product     Version         Host             IP             Duration

Software1      11.0    user             *.**.***.***     10:08
Software2      11.0     user            *.**.***.***     10:05

另外,我想知道是否可以多次应用相同的过滤器,因为上面的第一个例子,它在整个文件中重复。

答案1

在这种情况下你不能真正使用,cut因为数据的列没有明确定义。该cut实用程序的工作原理是精确地剪切数字,例如精确地剪切 3 个空格或制表符或任何您拥有的分隔符。在这种情况下,您将需要使用awk它将输入行分割为任意数量的连续空格(默认情况下)。

$ awk -v OFS="\t" '/^==/ { next } NR > 4 { print $1, $2, $4, $5, $6 }' file | column -t
Product    Version  Host  IP            Duration
Software1  11.0     user  *.**.***.***  10:08
Software2  11.0     user  *.**.***.***  10:05

程序awk会跳过从第 5 行开始的任何行==以及第 5 行之前的任何行。对于所有其他行,它会打印字段的选择(不是第三个,User)。

最后column -t将结果格式化为一个漂亮的表格。

答案2

使用 awk:

 awk '/--/{flag=1; next} /====/{flag=0} flag' filename

使用 SED:

 sed -n '/--/,/===/{/--/!{/===/!p}}' filename

使用 grep:

grep -E 'Product|Mathematica|MathKernel|Syntax' filename

答案3

我找到了最简单的解决方案:

awk '{print $1,$2,$4,$5,$6}' file1.log > file2.log

这允许只打印我喜欢的列

Product     Version         Host             IP             Duration

Software1       11.0         User          *.**.***.***     10:08
Software2        11.0        User           *.**.***.***     10:05

我没有意识到它的重要用途awk

相关内容