我有日志输出的下一个片段:
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