awk でフィールドの一部を切り取っても行全体を印刷する

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 の方がこの場合はより良い解決策かもしれません。この方法でカットすることに関しては、どちらも十分には知りません。

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

答え1

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

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

答え2

私はawkを使うだろう

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

最初のフィールド (スペースで区切られた) をターゲットにして、. の後に 6 つの数字が続くものを検索し、空にします。

答え3

GNUでsed

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

文字数が例のように一定であれば、

sed -r 's/^(.{8}).{7} /\1 /' filename

関連情報