CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさんこんにちは。これまで、本コラムでbashのシェルコマンドをいくつかご紹介しましたが、複数のコマンドをつなげて実行するパイプラインや、コマンドの出力をファイルへ吐き出すリダイレクトについてきちんと説明する機会がなかったので、今回はbashのシェルコマンドにおけるパイプラインとリダイレクトについて取り上げてみたいと思います。
パイプラインは、「|」の記号を用いて、|の左辺にあるコマンドを|の右辺に渡します。例えは、カレントディレクトリ上で「ls」コマンドを実行し、アルファベット順にソートしたい場合
$ ls | sort
と実行します。また、パイプラインは何段にも渡すことができますので、上記コマンドの実行結果に行番号をつけたい、という場合は
$ ls | sort | cat -n
というように実行します。
リダイレクトとは、コマンドとファイルやデバイスとの間を標準入出力でつないで処理することを指します。と言ってもこの説明だけでは何のことやら、ですよね。まず、実例から示します。
● lsコマンドの結果を 1. txt へ出力する
$ ls > 1.txt
こうすることで、lsコマンドの出力結果が、カレントディレクトリの1.txtへ出力されました。もう1度実行すると、先ほどの1.txtに上書きされてしまいます。
● lsコマンドの結果を 1. txt へ追記モードで出力する
$ ls >> 1.txt
上記コマンドを実行するたび、1.txtにその内容が追記されます。
● temp.log から今月の日付を含む行をgrepで抜き出す
$ grep 2018/04 < temp.log
● temp.logから今月の日付を含む行をgrepで抜き出し、その結果をout.logへ出力する
$ grep 2018/04 < temp.log > out.log
このように、前のコマンドと次のコマンドラインへ渡す役割をパイプラインが、コマンドからファイルやデバイスへ出力したり、逆にファイルやデバイスの内容を読み取る役割をリダイレクトが受け持ったりすることがおわかりいただけましたでしょうか。
特に、サーバー運用エンジニアはログの確認でコマンドを実行することが多いかと思います。grepやcut、head、tail、sed、awkなどをパイプラインで繋げて、業務の正確性を上げ、効率化することができるとよいでしょう。
シェルのプロセス置換を使うことで、数値や文字列の決め打ちを減らし、コマンド実行やシェルスクリプトのメンテナンス頻度を下げることが可能になります。先ほど例示した、あるファイルから今月の日付を含む行をgrepで抜き出すといったケースですと、
● プロセス置換を使わない場合
$ grep 2018/04 < temp.log
●プロセス置換を使った場合
$ grep `date +%Y/%m` < temp.log
または
$ grep $(date +%Y/%m) < temp.log
このように、「``(バッククォート)」または「$()」で囲われたコマンドの実行結果を引数として与えることが可能になります。先ほどの例ですと、プロセス置換を使うことにより、月またぎのたびに実行するコマンドの引数を変えずに済みます。
さて、本連載の第1回目で、「障害対象ホストへコマンドラインで調査を行うにあたり、私の場合以下のコマンドを使うことが多いです。」と書きました。
curl df dig du fuser ip last lsof nc ping ps ss telnet top vmstat w whois
これらコマンドを1回1回出力するだけでなく、出力結果を加工してファイルに書き出したり、grepに渡した後の終了ステータスを捕まえ、その条件によってメッセージを飛ばしたりなど、シェルコマンドだけでも応用範囲が広がります。
このような工夫で、より楽に精度を上げたオペレーションが可能になりますので、パイプラインとリダイレクト、プロセス置換は是非覚えておきたいものです。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes