私のファイルには次の行が含まれています。
50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1" 302 20 "-" "Rackspace Monitoring/1.1 (https://monitoring.api.rackspacecloud.com)"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1" 302 20 "-" "Rackspace Monitoring/1.1 (https://monitoring.api.rackspacecloud.com)"
今、私は次のような結果を得たいと思います。
50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
Linuxコマンド(grep / cut ...など)を使用してこれをどのように達成できますか?
答え1
少なくともこの特定のデータ(*)については、次のようになります。
を使用して、cut
スペースで区切られた最初の8つのフィールドを取得します。
$ cut -d' ' -f1-8 < someinputfile
50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
sed
、使用法、正規表現を使用して、s///
最初の二重引用符、スペース、およびその後のすべての項目を削除し、引用符を再挿入します。
$ sed -e 's/" .*/"/' < someinputfile
50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
(*これはApacheログファイルのように見えますが、正確な形式のすべてのバリエーションを覚えていないので、おそらく仮定をしているようです。)