Cutを使用してテキストファイルの特定の行を印刷する方法

Cutを使用してテキストファイルの特定の行を印刷する方法

次のログ出力フラグメントがあります。

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

プログラムは、awk5行目から始まるすべての行==と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

関連情報