正規表現を使用して行から特定の部分を抽出する

正規表現を使用して行から特定の部分を抽出する

私のファイルには次の行が含まれています。

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ログファイルのように見えますが、正確な形式のすべてのバリエーションを覚えていないので、おそらく仮定をしているようです。)

おすすめ記事