次のログ出力フラグメントがあります。
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行目の前のすべての行をスキップします。他のすべての行については、フィールドの選択を印刷します(3行目ではありません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