運用で使える咄嗟のコマンドリスト

障害対応では即時の対応が求められます。 コマンドがわからなくてあたふたしていると足手まといになってしまうので、生ログの解析に役立つコマンドを復習しました。

障害対応で役立つコマンドたち

cut

$ cat sample.csv
1, 2, 3
4, 5, 6
$ cut -d, -f1 sample.csv
1
4

uniq

grep

# hogeが含まれる行を前後1行表示
grep -A 1 -B 1 "hoge" sample.txt

圧縮ファイルを検索するときは、zgrepを利用する。

zgrep "hoge" sample.txt.gz

tail -f でログを監視するときは、grepで絞り込むと見やすくなる。

tail -f /var/log/messages | grep "error"

sed

tail

iconv

# Shift_JISからUTF-8に変換
iconv -f SHIFT_JIS -t UTF-8 sample.txt

tail -fでログを監視するときに、文字化けしている場合に使うことがある。

tail -f logfile | while read LINE ; do echo $LINE | iconv -f SJIS -t UTF-8 ; done

nkf (Network Kanji Filter)

paste

awk

練習問題

問 1. 2 つの csv ファイルの第 3 列に共通する値を抽出する

2 つのファイルを比較して、それぞれのファイルの 3 列目に共通して存在する値をみつけてください。ただし同一ファイル内で値がかぶることはありません。

# A.csv
1, 1, 1
2, 2, 2
3, 3, 3
# B.csv
4, 4, 4
5, 5, 2
6, 6, 6

答え

2

回答

cut -d "," -f3 A.csv B.csv | sort | uniq -d
2

問 2. 特定の時間帯に発生した特定のエラーコードを含む行を抽出する

午後 12:00-17:00 の間に発生した ERROR 500を含むすべての行を抽出してください

# logs.txt
2024-05-01 11:59:00 INFO 200 Success
2024-05-01 12:00:00 ERROR 500 Internal Server Error
2024-05-01 12:01:00 INFO 200 Success
2024-05-01 13:00:00 ERROR 500 Internal Server Error
2024-05-01 17:00:00 ERROR 500 Internal Server Error
2024-05-01 17:01:00 ERROR 500 Internal Server Error
2024-05-01 18:00:00 ERROR 500 Internal Server Error

回答

awk '$2 >= "12:00:00" && $2 <= "17:00:00" && /ERROR 500/' logs.txt

2024-05-01 12:00:00 ERROR 500 Internal Server Error
2024-05-01 13:00:00 ERROR 500 Internal Server Error
2024-05-01 17:00:00 ERROR 500 Internal Server Error

問題 3: ログファイルから最新の「BEGIN」から「END」までのセクションを抽出してください

ログファイルには複数の処理が記録されており、各処理は “BEGIN” と “END” というキーワードで囲まれています。 このログファイルから最も最新の “BEGIN” から “END” までのセクションを見つけ出し、その間のすべての行を抽出してください。

# logs.txt
INFO 2024-05-01 11:59:00 process started
BEGIN 2024-05-01 12:00:00 task 1 started
INFO 2024-05-01 12:01:00 processing
END 2024-05-01 12:02:00 task 1 completed
BEGIN 2024-05-01 13:00:00 task 2 started
INFO 2024-05-01 13:01:00 processing
INFO 2024-05-01 13:02:00 still processing
END 2024-05-01 13:03:00 task 2 completed

回答

ログファイルを逆順にして、最初の ‘BEGIN’ と ‘END’ のセクションを抽出し、それを再度逆順に戻す。 flag=1 の時に print して、END がきたら exit する。

tac logs.txt | awk '/END/{flag=1} flag; /BEGIN/{print; exit}' | tac

問題 4 特定日付のログファイルからエラーを含むファイルを抽出

あなたは特定の命名規則が適用されたログファイルが保存されているディレクトリにアクセスできます。これらのファイルは {name}.{YYYY-mm-dd}.log という形式で命名されています。2024-04-30 の日付を持つファイルの中から、「ERROR」という文字列がファイルの中身に含まれているファイルの名前を全て出力するスクリプトを作成してください。

仮に error_report.2024-04-30.log と app_error.2024-04-30.log のファイルがログ内に “ERROR” という文字列を含む行を持っているとします。

system.2024-04-28.log
error_report.2024-04-30.log
network.2024-04-30.log
app_error.2024-04-30.log

回答

grep -l 'ERROR' *.2024-04-30.log

comments powered by Disqus