web-dev-qa-db-ja.com

awkで列を印刷し、同時に1つの列だけを編集するにはどうすればよいですか?

まだ初心者レベルです!

私の_file.txt_の1行:

_158.45.456.756 - - [04/Feb/2016:10:51:24 -0500] "GET /tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E HTTP/1.1" 200 8848 "http://site/map.html" "Mozilla/5.0 (Windows NT 6.1; MOM64; Trident/7.0; mv:10.0) like Blah"
_

結果欲しい達成するため

_[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/7852008848
_

今まで試したこと

_awk '{ print $4 $5 $7 $9 $10}'_は以下を返します:

_[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E2008848
_

この部分_.png?wb75678545=75D2503E_を行に含めるべきではないため、これは良くありません。

また、7番目の列を印刷し、最後のポイント以降のすべてをawk '{ print $7}' | grep -Po '.*(?=\.)'で削除して、特定の列に必要な結果を返しました。

_/tiles/1.0.0/cd/base/1/85/785
_

ただし、行の他の部分は除外されます。


質問

必要なすべての列を同時に、または7列目だけを編集する前に印刷するにはどうすればよいですか?

1
vayacondios2015

awkの場合:

_awk '{print $4 $5 gensub("(.*/[^.]+)\\..*", "\\1", 1, $7) $9 $10}' 
_
  • printは、gensub()で抽出された7番目のフィールドの必須部分のみを使用して、変更せずに必須フィールドを出力します

  • gensub("(.*/[^.]+)\\..*", "\\1", 1, $7)では、正規表現パターン"(.*/[^.]+)\\..*"は、最後の_._の後の_/_の前の部分と一致し、キャプチャされたグループ_1_に入れます。そして、残りは_\\..*_に一致します。置換では、キャプチャされたグループのみがその部分のみを取得するために使用されます

  • 正規表現パターン_(.*/[^.]+)\\..*_では、キャプチャされたグループ_()_内の部分、つまり_.*/[^.]+_、_.*/_内の部分は、最後の_/_まで貪欲に一致し、次に_[^.]+_に一致します次の_._までの部分に一致します。これは必要な部分であるため、キャプチャされたグループ1として保持され、代わりにグループを使用し、_\\._はリテラル_._に一致します。 _.*_は残りの文字列と一致します

コメントから、_._をマッチ内に保持する場合、つまり_._も必要な場合:

_awk '{print $4 $5 gensub("(.*/[^.]+\\.).*", "\\1", 1, $7) $9 $10}' 
_

例:

_% awk '{print $4 $5 gensub("(.*/[^.]+)\\..*", "\\1", 1, $7) $9 $10}' <<<'158.45.456.756 - - [04/Feb/2016:10:51:24 -0500] "GET /tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E HTTP/1.1" 200 8848 "http://site/map.html" "Mozilla/5.0 (Windows NT 6.1; MOM64; Trident/7.0; mv:10.0) like Blah"'
[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/7852008848

% awk '{print $4 $5 gensub("(.*/[^.]+\\.).*", "\\1", 1, $7) $9 $10}' <<<'158.45.456.756 - - [04/Feb/2016:10:51:24 -0500] "GET /tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E HTTP/1.1" 200 8848 "http://site/map.html" "Mozilla/5.0 (Windows NT 6.1; MOM64; Trident/7.0; mv:10.0) like Blah"'
[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/785.2008848
_
2
heemayl