Webサーバーに関するログ情報を含むテキストファイルがあります。
日付形式: 日-月-年
サンプルコンテンツ:
/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz
/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz
日付順(3列目)で一覧表示したいです。 sort コマンドを試しましたが、日付別にソートされません。
予想出力:
/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz
/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz
修正する:
Sort syntax:
sort -k4.7,4.11 -k4,5
/tmp/backup/7-12-2020/access_04.log
/tmp/backup/7-12-2020/error_02.log
/tmp/backup/7-12-2020/error_03.log
/tmp/backup/7-12-2020/error_04.log
/tmp/backup/7-12-2020/error_05.log
/tmp/backup/8-11-2020/access_01.log
/tmp/backup/8-11-2020/access_02.log
/tmp/backup/8-12-2020/error_01.log
/tmp/backup/8-12-2020/error_02.log
/tmp/backup/8-12-2020/error_03.log
/tmp/backup/8-12-2020/error_04.log
/tmp/backup/8-12-2020/error_05.log
/tmp/backup/9-11-2020/access_01.log
/tmp/backup/9-11-2020/access_02.log
/tmp/backup/9-11-2020/access_03.log
/tmp/backup/9-11-2020/access_04.log
答え1
このような特定のパターンでは、パス名を別のコンポーネント/
に分割して-
行の先頭に配置できます。
awk '{
split($0, f, "[/-]");
printf "%04d-%02d-%02d\t%s\t%s\n", f[6], f[5], f[4], f[7], $0
}'
その後、日付(yyyy-mm-dd
)とファイル名(たとえば)をaccess_NN.log.gz
並べ替えます。
sort
最後に、分類コンポーネントを剥がします。
cut -f3-
サンプルデータがファイルにあると仮定すると、/tmp/logs
次のように整理できます。
awk '{ split($0, f, "[/-]"); printf "%04d-%02d-%02d\t%s\t%s\n", f[6], f[5], f[4], f[7], $0 }' /tmp/logs |
sort |
cut -f3-
/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz
/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz
答え2
ここで、すべての行が常に/tmp/archive/
同じ長さで始まると仮定すると、次のようにできます。
sort -t- -k3,3.4n -k1.14,1n -k2,2n -k3.5
ここでは、次のように単純化できます。
sort -t- -k3n -k1.14n -k2n -k3.5
どのロケールでも千単位の区切り文字にはなりません-
(マイナス記号文字でもあるため)。したがって、フラグの場合は、n
キー仕様(たとえば、-k1.14n
最初の行から選択)または(選択のみ)を使用できます。7-12-2020/access_04.log
-k1.14,1n
7
7
数字。