web-dev-qa-db-ja.com

テキストファイルの特定の行をカットで印刷する方法

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

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

また、上記の最初の例はファイル全体で繰り返されるため、同じフィルターを何度も適用できるかどうかも知りたいです。

1
Mareyes

Awkの使用:

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

SEDの使用:

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

Grepの使用:

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

この場合、データの列が明確に定義されていないため、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は、結果をナイステーブルにフォーマットします。

1
Kusalananda

私はこれに対する最も簡単な解決策を見つけました:

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の重要な使用法を理解していませんでした

0
Mareyes