圧縮されたログと圧縮されてないログの両方をgrepする

別にログに限った話ではないのだが、ログローテートで、直近のファイルは非圧縮で、少し前の世代から圧縮されているケースは多いと思う。

$ ls -ltr syslog*                                                                                                                                                                              -rw-r----- 1 syslog adm  50488 12月 17 00:00 syslog.7.gz                                                                                                                                                         -rw-r----- 1 syslog adm  22049 12月 18 00:00 syslog.6.gz                                                                                                                                                         -rw-r----- 1 syslog adm  27255 12月 19 00:00 syslog.5.gz
-rw-r----- 1 syslog adm  23651 12月 20 00:00 syslog.4.gz
-rw-r----- 1 syslog adm  16370 12月 21 00:00 syslog.3.gz                                                                                                                                                         -rw-r----- 1 syslog adm  17175 12月 22 00:00 syslog.2.gz                                                                                                                                                         -rw-r----- 1 syslog adm 282433 12月 23 00:00 syslog.1
-rw-r----- 1 syslog adm 206387 12月 23 11:10 syslog

こんなとき

圧縮されてないときは、乱暴に全部catしてgrepすればいいと思う。

$ cat syslog*|grep PATTERN

ただ圧縮ファイルと通常ファイルが混在していると当然うまくいかない。

こんなときは、複数のコマンドをカッコ()でまとめてあげればいい。

$ ( zcat syslog.3.gz syslog.2.gz ; cat syslog.1 syslog ) | grep PATTERN

こんな感じ。圧縮ファイル用のzcatと通常ファイルのcatのコマンドをカッコでまとめている。

ファイルをもっとまとめて処理したいなら以下などだろうか。

$ ( ls -1tr syslog*.gz | xargs zcat ; cat syslog.1 syslog ) | grep PATTERN

望み通りの動作はしているが、もう少し簡潔な方法が無いかとも思う。

netcat(nc)でポートチェック

ふとした時に、相手先サーバーのポートがopenしているかチェックをしたい時は結構ある。nmapは仰々しいし、そもそもインストールされていないときもある。最近のLinuxであれば、ncコマンドはまず入っているので、これを使ってPort Scanを行う。

使い方は簡単で、-z オプションを付けて実行するだけ。timeoutを1秒にするため、-w 1 のオプションも付ける。

$ nc -w 1 -z www.yahoo.co.jp 80
$ echo $?
0

$ nc -w 1 -z www.yahoo.co.jp 81
$ echo $?
1

yahooの80ポートに接続したときは、リターンコード 0 で成功。

81ポートのに接続したときは、リターンコード 1 で失敗。

続きを読む netcat(nc)でポートチェック

bashのhistoryに日時を入れる方法

いや。何年毎日bashと向き合って来てたのよ。と言いたくなるくらい簡単な方法があった。環境変数HISTTIMEFORMATにフォーマットを指定するだけ。

$ export HISTTIMEFORMAT='%F %T '

ただ過去のhistoryには正しい日付が入りません。これからのhistoryに入れるには.bashrcとかに設定します。システムワイドでよければ /etc 以下のbashrc で。

$ echo "export HISTTIMEFORMAT='%F %T '" >> ~/.bashrc

今までhistory見て、実行した時間が分かれば便利なのにと思ったことが何度もあったけど、これで救われる。

Linuxのdateコマンドで和暦(元号)表示

とりあえず新元号が発表されたので、Linuxのコマンドで和暦(元号)を表示してみる。

職業柄、ユーザから「御社で構築したシステムは、新元号に対応してますか?」って質問を結構いただき、Linuxなんで関係ないと雑な回答をしていたが、dateコマンドは一応対応しているらしい

$ date -d "2020/01/01 12:00:00" +"%Ec"
平成32年01月01日 12時00分00秒

$ date -d "2020/01/01 12:00:00" +"%EY"
平成32年

今だけ平成32年が表示出来るのだろうか。アップデートが降って来たらもう見れない?令和2年になる(まだ結構違和感)

日本の都合で修正に当たるDeveloperのみなさん、すみません。

findでサーバー内で3日以内に修正されたファイルを探す

findのオプションが相変わらず良くわからない。

完全に自分用の備忘録だが、全ファイルで3日以内に修正されたやつを探す。

/procとかは除外して。

きっともっとエレガントな方法があるのだと思う。

findのor,andがマジわからん。