web-dev-qa-db-ja.com

awkでフィールドの一部を切り取り、それでも行全体を印刷します

私はこの行を持っています:

08:30:02.480507 IP 192.168.100.150.65119 > 192.168.100.151:53 59865 [1au] A? click.em.redbox.com. (48)

タイムスタンプの「.480507」を切り取って、次のようにする必要があります。

08:30:02 IP 192.168.100.150.65119 > 192.168.100.151.53: 59865 [1au] A? click.em.redbox.com. (48)

私はいくつかのawkとcutステートメントをいじくり回しましたが、役に立ちませんでした。私はawkワンライナーを見つけたいのですが、sedがこれに対するより良い解決策かもしれません。この方法でカットすることになると、私はどちらかについて十分に知りません。

注:これは例であり、すべて異なるタイムスタンプを持つ複数の行でこのアクションを実行する必要があるため、切り取る必要のあるタイムスタンプの部分は同じではありません。

3
user53029

awkを使用する場合、おそらく最も簡単な方法は、最初の空白で区切られたフィールドで正規表現の置換を行い、ピリオドからフィールドの終わりまですべてを置き換えることです。

awk '{sub(/\..*/,"",$1)}1' somefile
1
steeldriver

私はawkを使用します

awk --posix '{ gsub(/\.[[:digit:]]{6}/, "", $1); print }' filename

最初のフィールド(スペース区切り)をターゲットにして、を検索します。続いて6つの数字を入力し、空にします。

2
Zachary Brady

with GNU sed

_sed -r 's/^([^.]+)\.[0-9]+ /\1 /' filename
_
  • ^([^.]+)最初のドット文字までの開始文字列をキャプチャします
  • _\.[0-9]+_一致ドット文字の後に1桁以上の文字が続く

例に示されているように文字数が一貫している場合、

_sed -r 's/^(.{8}).{7} /\1 /' filename
_
0
Sundeep