まだ初心者レベルです!
例私の_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列目だけを編集する前に印刷するにはどうすればよいですか?
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
_