はじめに
トラブルシューティングの体験をしてliunxコマンドを記憶に定着させるためと
現場でどんなことをやっているか実際にやって経験値を積みたいのでやってみた。
#2のシナリオをやってみた
問題 webサーバーにaccess.logファイルがありそこにhttpリクエストが1行ずつ構成されているのでその中で最も多くアクセスしているIPアドレスを特定して指定されたファイルに書き込む事で解決できる。
まずはlsでファイルがあるか確認した。
ls -la /home/admin/access.log
ちゃんと存在していた
fileの中身をのぞいてみた
cat /home/admin/access.log
確かになんかいっぱいアクセスされている、この中から一番アクセスされてるIPアドレスの特定...なるほど!分からん。
ヒントを見てみた
ヒントを見るとawk
を使えるみたいなことを書いていた。みたことあるけどいまいち使い方がわからないので調べた。
awkとは
awk(オーク)と呼ぶ。由来はプログラミング言語開発者のAho(エイホ)さん、Weinberger(ワインバーガー)さん、Kernighan(カーニハン)さんの頭文字からきてるらしい
awk はテキスト処理が得意で表記表現の文字列の検索が得意で他にいっぱいやれることがあって全ては把握できていない
awk '{print $1}'
こんな構成ではfile内のスペースやタブなどで区切られている部分を絞るかんじで$1なら一番最初の区切りが対象になる
上のaccess.logファイルの中身でいうと、
$2=-(ハイフン)
$3=-(ハイフン)
$4=タイムスタンプ
のようにいる部分だけ指定して表示させたり集計することができる。
これにいくつかコマンドを追加してIPアドレスの集計を行う
sort コマンド
sort(ソート)は表示入力やファイルの内容をソートする役割
ただ整列、並び替えするだけでは集計出来ないのでさらにコマンドを追加
-g オプション uniqの出力を数値で並べる
-r オプション逆順での意味のソートをする 数値が高い順に並ぶ
uniq コマンド
uniq(ユニーク)はソートされた内容の重複を削除して、重複した行の数を数える、このコマンドを正常に使うには先にsortで並び替える必要がある。
-c オプションでそれぞれの行が何回出現したかを表示する。
head コマンド
head(ヘッド) 上位10を出力する これを入れないと行が多すぎる時に見切れる
catからawkに渡す
cat /home/admin/access.log | awk '{print $1}' |sort | uniq -c | sort -gr | head
catでファイルの中身を出力してそれをパイプでawkに渡す事で、重複した行を削除して同じ行を計算してくれる。
表示のしていは$1だけなのでIPアドレスのみが多い順で10位まで出力される
特定したIPアドレスを指定されたファイルに書き込む
vimなどのエディタではなくヒントに書かれてあるecho > {ファイル名}
の形で記述する
# ファイルはSadServersから指定がある
echo 特定したIP > /home/admin/highestip.txt
回答が正解か確認してみる
見事に正解した! ヒントがほぼ答えなのでそのコマンドについて調べて概要がわかると正解に辿りつけそう。ただ、全ての機能とかオプションまで覚えるのは大変だなと感じた。
まとめ
awk
はテキスト処理と表記表現の文字列の検索が得意で、必要な情報だけ見たい時にそこだけピックアップできる。重複する情報もあるのでsort
で並び替えてuniq
ソートされた内容の重複を削除して-cで集計する。
集計したものをsort -gr
でunip
の出力した内容を数値と逆順で並び替える。
これで最も多くアクセスしているIPアドレスを特定することができた。
感想
awk
は奥が深くてやれることが多くあり全て把握するのには時間がかかると思った。
こうして実体験する過程で使い方を学ぶことで、実際に障害復旧する時に大いに役立つコマンドだと言うことが分かった。