ログの出力の次のフラグメントがあります:
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
===================================================================================
cutコマンドを使用して、次のように出力のみをフィルタリングします:
Product Version Host IP Duration
Software1 11.0 user *.**.***.*** 10:08
Software2 11.0 user *.**.***.*** 10:05
また、上記の最初の例はファイル全体で繰り返されるため、同じフィルターを何度も適用できるかどうかも知りたいです。
Awkの使用:
awk '/--/{flag=1; next} /====/{flag=0} flag' filename
SEDの使用:
sed -n '/--/,/===/{/--/!{/===/!p}}' filename
Grepの使用:
grep -E 'Product|Mathematica|MathKernel|Syntax' filename
この場合、データの列が明確に定義されていないため、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行目より前の行をスキップします。他のすべての行では、フィールドの選択を出力します(3番目ではなくUser
)。
最後のcolumn -t
は、結果をナイステーブルにフォーマットします。
私はこれに対する最も簡単な解決策を見つけました:
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
の重要な使用法を理解していませんでした