質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

1287閲覧

linuxのsortコマンドで複雑なログのソートを行いたいです。

Carlos_is_only

総合スコア42

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2021/05/27 17:56

以下のログについてsortコマンドでソートするにはどうすればいいでしょうか?
[]内に日付で古いログを先頭に新しいログはしたのほうにソートしたいです。(昇順)

sortコマンドのデリミターを"["で指定してしまうと年を用いたソートのキー項目の指定ができず
"/"をデリミターに指定してしまうと月、日のキー項目の取得ができません。

10.222.11.11 - - [08/Feb/2020:17:21:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [07/Jan/2021:18:21:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [09/Jun/2021:19:13:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [10/Mar/2021:20:12:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [21/Dec/2021:01:11:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [22/Oct/2021:02:20:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [05/Apr/2021:03:21:21:21 +0800] "POST /set.python HTTP/1.1 300 "-"

以下のようなコマンドを実行しましたがうまくいきませんでした。
結果の内容を確認するとうまくソートされていませんでした。

ls -tr /var/log/httpd/accesslog* | xargs -I {} grep -h -G "POST" | LANG=C sort -t '[' -k2.8,2.11 -k2.4,2.6M -k2.1,2.2n -k2.13,2.23

何かいい方法ありませんでしょうか?
いくら考えてもダメです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2021/05/27 20:50

単に逆順にしたいなら tac か rev じゃだめなのかな?
guest

回答2

0

お書きのコードで出来てるみたいに思えますが。

sh

1cat <<EOF | 210.222.11.11 - - [08/Feb/2020:17:21:21:21 +0800] "POST /set.python HTTP/1.1" 310.222.11.11 - - [07/Jan/2021:18:21:21:21 +0800] "POST /set.python HTTP/1.1" 410.222.11.11 - - [09/Jun/2021:19:13:21:21 +0800] "POST /set.python HTTP/1.1" 510.222.11.11 - - [10/Mar/2021:20:12:21:21 +0800] "POST /set.python HTTP/1.1" 610.222.11.11 - - [21/Dec/2021:01:11:21:21 +0800] "POST /set.python HTTP/1.1" 710.222.11.11 - - [22/Oct/2021:02:20:21:21 +0800] "POST /set.python HTTP/1.1" 810.222.11.11 - - [05/Apr/2021:03:21:21:21 +0800] "POST /set.python HTTP/1.1" 9EOF 10 11LANG=C sort --debug -t"[" -k 2.8,2.11 -k 2.4,2.6M -k 2.13,2.23

結果:

plain

110.222.11.11 - - [08/Feb/2020:17:21:21:21 +0800] "POST /set.python HTTP/1.1 2 ____ 3 ___ 4 ___________ 5___________________________________________________________________________ 610.222.11.11 - - [07/Jan/2021:18:21:21:21 +0800] "POST /set.python HTTP/1.1 7 ____ 8 ___ 9 ___________ 10___________________________________________________________________________ 1110.222.11.11 - - [10/Mar/2021:20:12:21:21 +0800] "POST /set.python HTTP/1.1 12 ____ 13 ___ 14 ___________ 15___________________________________________________________________________ 1610.222.11.11 - - [05/Apr/2021:03:21:21:21 +0800] "POST /set.python HTTP/1.1 17 ____ 18 ___ 19 ___________ 20___________________________________________________________________________ 2110.222.11.11 - - [09/Jun/2021:19:13:21:21 +0800] "POST /set.python HTTP/1.1 22 ____ 23 ___ 24 ___________ 25___________________________________________________________________________ 2610.222.11.11 - - [22/Oct/2021:02:20:21:21 +0800] "POST /set.python HTTP/1.1 27 ____ 28 ___ 29 ___________ 30___________________________________________________________________________ 3110.222.11.11 - - [21/Dec/2021:01:11:21:21 +0800] "POST /set.python HTTP/1.1 32 ____ 33 ___ 34 ___________ 35___________________________________________________________________________

投稿2021/05/28 14:49

otn

総合スコア84804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

月名がアルファベット表記になっているので、sortコマンド単体では無理でしょう。
というわけでperlです。

ls -tr /var/log/httpd/accesslog* | \ perl -MTime::Piece -le 'print sort {($aa)=$a=~/[(.*)]/; ($bb)=$b=~/[(.*)]/; (Time::Piece->strptime($aa, "%d/%b/%Y:%H:%M:%S:%S %z")->datetime()) cmp (Time::Piece->strptime($bb, "%d/%b/%Y:%H:%M:%S:%S %z")->datetime())} <>'

追記: GNU sortコマンドで頑張る

-Mなんて知らなんだわと思い、試してみましたが、普通にやるとうまく行きませんでした。

# テストデータ $ perl -le 'print join("\n", map {ucfirst($_)} qw/jan apr feb jun mar dec oct/)' Jan Apr Feb Jun Mar Dec Oct
$ perl -le 'print join("\n", map {ucfirst($_)} qw/jan apr feb jun mar dec oct/)' | sort Apr Dec Feb Jan Jun Mar Oct $ perl -le 'print join("\n", map {ucfirst($_)} qw/jan apr feb jun mar dec oct/)' | sort -M Apr Dec Feb Jan Jun Mar Oct

どうもlocaleを環境変数にて設定する必要があるらしいです。

$ perl -le 'print join("\n", map {ucfirst($_)} qw/jan apr feb jun mar dec oct/)' |LC_TIME=C sort -M Jan Feb Mar Apr Jun Oct Dec
$ cat test.log | LC_TIME=C sort -t '[' -k2.8n -k2.4,2.6M -k2.1,2.2n 10.222.11.11 - - [08/Feb/2020:17:21:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [07/Jan/2021:18:21:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [10/Mar/2021:20:12:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [05/Apr/2021:03:21:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [09/Jun/2021:19:13:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [22/Oct/2021:02:20:21:21 +0800] "POST /set.python HTTP/1.1 300 "-" 10.222.11.11 - - [21/Dec/2021:01:11:21:21 +0800] "POST /set.python HTTP/1.1 300 "-"

投稿2021/05/27 20:23

編集2021/05/28 08:40
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Carlos_is_only

2021/05/28 00:47

月のアルファベットなら -kの主キーの列にMをつければいいと思うのですがだめですか?
KojiDoi

2021/05/28 03:22

> -kの主キーの列にMをつければいいと思うのですがだめですか? 知りませんでした! ググってみたところ、まさに質問者氏がやろうとしていることを試みた記事を発見しました。 [sortコマンドに悩まされるの巻 - Qiita](https://qiita.com/hotta/items/912f67c3f034b6696ca5) ので、この記事の「お題2」を参考にすればよいでしょう。 まあ私はperlを使いますが。
Carlos_is_only

2021/05/28 07:20

いやーーーこれ、やろうとしたんですけど 結局うまくいきませんでしたね・・・ 結局月の部分のところがキチンとソートできませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問