2016-04-12 6 views
0

行から特定のフィールドを切り取る方法は?cutまたはAwkを使用する特定のフィールド

cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14はフィールドが変更されるため使用できません。

のは、私はは/ var/log/testというファイルがあり、ファイル内の行の1は次のようになりましょう:

Apr 12 07:48:11 172.89.92.41 %ASA-5-713120: Group = People, Username = james.robert, IP = 219.89.259.32, PHASE 2 COMPLETED (msgid=9a4ce822) 
私はユーザー名と日付/時刻を取得する必要があり

(してください

grep "james" /var/log/tes | cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14 

が私のために動作しません、それが持っているので:。ノートの列は、私が使用している場合、それは私がユーザ名= james.robertと一致する必要がある理由だと4月12日午前7時48分11秒

、変化し続けますユーザー名と一致するようにするeとユーザー名とデータ/時間だけを表示します。助言がありますか?

ので、[OK]を

私はこれを使用します。

awk -F'[ ,]' '$12~/username/{print $1,$2,$3,$12}' /var/log/test 

をしかしフィールドは動かし続けるので、それは、一部のユーザーではなく、他人のために動作します。

このコマンドのサンプル出力は次のとおりです。

4月12日午前6時00分39秒james.robert

しかし、私は、このユーザー名でこのコマンドをしようとすると、それは動作しません。以下を参照してください:ここ

上記のコマンドでは何も表示されないことをもう一つの例である:

Apr 8 12:16:13 172.24.32.1 %ASA-6-713228: Group = people, Username = marry.tarin, IP = 209.157.190.11, Assigned private IP address 192.168.237.38 to remote user 
+0

最初のフィールドは常に日付ですか? –

+0

はいです。ユーザー名は移動し続けます。 –

+2

例として複数のレコードを投稿してください。あなたは私たちのカップルから尋ねられました。私たちは暗闇の中で撮影しており、あなたのエッジケースでは推測できません。 – JNevill

答えて

1

あなたのファイルが一貫し

awk -F'[ ,]' '{print $1,$2,$3,$12}' file 

Apr 12 07:48:11 james.robert 
構成されている場合-F

$ awk -F' +|,' '{print $1,$2,$3,$12}' file 

Apr 12 07:48:11 james.robert 
Apr 8 12:16:13 marry.tarin 

を変更修正する

ユーザー名と一致する必要がある場合は、

$ awk -F'[ ,]' '$12~/james/{print $1,$2,$3,$12}' file 
Apr 12 07:48:11 james.robert 

UPDATE

OKをあなたのサンプル入力を使用して、あなたのスペースが一貫していません、上記のように/ pattern /を追加してユーザーとのマッチを制限することができます。 -Fオプションの変更に注意してください。

-F' +|,'は 、スペース(一つまたは複数)またはカンマのフィールドの区切りを設定し、残りのフィールドを計数し、印刷するために正しいものを拾っています。 /pattern/は、正規表現パターンと一致する行をフィルタリングします。これは、特定のフィールドのみに制限することができます(例:12)$12~/pattern/

によってあなたのテキストが混在する場合を含むことができ、あなたは大文字小文字を区別しないようにしたい、tolower()機能、sedで例えば

$ awk -F' +|,' 'tolower($12)~/patterninlowercase/{print $1,$2,$3,$12}' file 
+0

それは私に別の結果を与えている。また、ユーザー名とはどこが一致していますか? –

+0

投稿してください、あなたが見たいと期待して何を持ってください。 – karakfa

+0

これはもっと良く機能しますが、まだいくつかの問題があります。ここでは、日付とユーザー名と日付を別の方法で取得することはできません。 2人、3人のユーザーで動作するためですが、別の名前の4番目のユーザーを入力すると何も表示されません。他のメカニズムはありますか? –

0

あなたは、カンマで区切るためにawkを使用して、あなたが気枚で取得するためにsubstr()length()を使用することができます:

awk -F"," '{print substr($1,1,15), substring($3, 13, length($3)-12)}' /var/log/test 
+0

それは私にエラーを与える。また、これはユーザー名と一致する場所でもありますか? –

+0

ここでは、カンマの配置が一貫しているため、 'username = 'フィールドが3番目の位置にあると仮定しています。 – JNevill

+2

おそらく...あなたのログファイルに複数のレコードが含まれていれば、これらのレコードが入っているかもしれないさまざまなフォーマットを知ることができれば助かります。あなたは、あなたのすべての場合を捉えることができると思います。フォーマットされたレコードを別に見ることなく、それらを推測するのは難しいです。 – JNevill

1

使用する場合:gawk

sed -r 's/^([A-Za-z]{3} [0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*(Username = [^,]*).*/\1 \2/g' file 
+0

それは私が必要以上に多くの情報を与えました。また、ユーザー名と一致する場所はどこですか?フィールドが動き続けるので... –

+0

@RomiKajaki、 '(ユーザ名= [^、] *)は'ユーザ名と一致し、データがグループ化されます。このグループは後で '\ 2'(2番目のグループ)を使って参照することができます。 – sat

0

awk '{u=gensub(/.*(Username = [^,]*).*/,"\\1","g",$0);if (u ~ "james") {print u,$1,$2,$3}}' file 
+0

動作しませんでした。それはすべてを示す! 私はユーザー名と日付のみが必要です。 ような:4月12日07:48:11 james.robert –

0

以下のperlは、タブで区切られた日付とユーザー名を表示します。有効なユーザ名文字を[\w.]に追加してください。

perl -ne ' 
    print $+{date}, "\t", $+{user}, "\n" if 
     /^(?<date>([^\s]+\s+){2}[^\s]+).*\bUsername\s*=\s*(?<user>[\w.]+)/ 
    ' 

さまざまな量のタブとスペースが許可されています。

関連する問題