スペースで区切られたログの後ろから2番目の値を取得するシェルスクリプト

注意事項

概要

わけあって必要になったので自分がコピペする用のメモ。

スペースで区切られたログの後ろから2番目の値を取得する処理をシェルスクリプトで書く。
汎用的に言い換えると、「ログの1行を○○の文字で分割して、分割した後ろから○○番目の文字列を取得する」。

環境:
 bash

やりたいこと

・とあるミドルウェアが出力するログファイルで、スペースで区切って後ろから2番目の文字列を取得したい。
高級言語は使えない環境だったのでbashで書く。
・対象のログファイルは圧縮されたgzファイルで、同一フォルダに大量にある前提。
 →なのでファイル指定はコマンドライン引数でワイルドカードを使って実現することにした。
・1つ1つのファイルが大きいかったのでreadコマンドを使ってみた。

スクリプトのコード

(補足) gzファイルのログが前提なので、
macの場合はgzcat、linuxの場合はzcatコマンドを使うけど
プレーンテキストを読むのならcatで。

#!/bin/bash

#コマンドライン引数で指定されたファイルの数だけループ
for arg in "$@"
do
    #圧縮ファイルを解凍して1行ごと処理
    gzcat $arg | while read str
    do
        #スペースで分割して配列に格納
        array=(`echo $str | tr -s ' ' '\n'`)
        #配列の後ろから2番目の要素番号を取得
        index=$((${#array[@]}-2))

        echo ${array[$index]}
    done
done

実行コマンド例

hoge.sh がシェルスクリプトのファイルで、ログファイルとしてtmp1.gzとかtmp2.gzとかがスクリプトファイルと同じフォルダに存在する場合の例。

# bash ./hoge.sh tmp*.gz