Linuxコマンドやシェルについて深く知らなくても大抵の作業は問題なく行う事ができます。
しかし可能であればスマートに行いたいですよね。知っているか知らないかどうかで作業効率を上げたり作業ミスを防ぐ事ができますから。
そこで、あまりアクロバティックな例は取り上げず仕事でコマンドを打つときや手順書を作成するときに使えるかな?と思った実用性のあるテクニックをご紹介します。
このページは随時更新します。便利なコマンドやテクニックをご存じの方は教えてください。
タップできる目次
コマンド結果をファイルのように扱う
例としてAとBのファイルをsortしてから比較したいとしましょう。そんなときは次のようなコマンドを実行する方が多いと思います。
sort a > a.sort
sort b > b.sort
diff a.sort b.sort
これでも良いのですが冗長です。このコマンドは次のように置き換える事ができます。
diff <(sort a) <(sort b)
たったの1行で済みます。「<(コマンド)」とするとコマンドの実行結果をファイルのように扱う事ができて便利です。
リモートホストにスクリプトを送信して実行させる
リモートホストにログインせずコマンドを実行する場合は次のようにするかと思います。
ssh infrapod.net ‘command’
単純なコマンドであればこれで良いのですが、長いコマンドやスクリプトでは厳しいでしょう。その場合はスクリプトを送信してしまいましょう。次のようにします。
cat myscript.sh | ssh infrapod.net ‘sh’
複数のコマンド結果を一度にリダイレクトする
たとえば次のようなコマンドの結果をひとつのファイルに書き出したいとします。
- date
- ps -elf
- w
- last
この場合次のようにする事が多いでしょう。
date > outfile
ps -elf >> outfile
w >> outfile
last >> outfile
これでも良いのですが、もうちょっとスッキリさせたいところです。このような場合はコマンドのグループ化が使えます。
{
date
ps -elf
w
last
} > outfile
あるいは次のようにしてもOKです。
{ date; ps -elf; w; last; } > outfile
{}を使うとコマンドの実行結果をまとめてリダイレクトしてくれるのでスッキリします。
変数の部分切り出しを行う
例として次のような文字列があるとしましょう。
- xxxlb01
- xxxfw01
- xxxsv01
4文字目と5文字目でlb(Load Blancer)やfw(FireWall)、sv(Server)のように種類を表していて、その文字列を取り出したいとします。
そのような場合は次のようにします。
buf=”
xxxlb01
xxxfw01
xxxsv01
“
for j in ${buf}; do
echo ${j:3:2}
done
${j:3:2}の箇所がミソです。これは変数「j」の4番目(0から数えるため3になっている)を2文字切り出す、という事をしています。
上記のコマンドを実行すると次のようになります。
user@computer$ buf=”
xxxlb01
xxxfw01
xxxsb01
“
$
user@computer$ for j in $buf; do
> echo ${j:3:2}
> done
lb
fw
sv
$
拡張子を一発で変更する
hoge.txtをhoge.logに変えたい場合、一般的には次のようにします。
mv hoge.txt hoge.log
これで良いのですが、できればもっと短くスマートにしたいところです。たとえば次のようにできます。
mv hoge.{txt,log}
バックアップコピーを取るときに便利なコマンド
サーバーで設定変更を行う際は元のファイルのコピーを保存する事が多いはずです。大抵はファイル名に続いて日付を付ける事が多いようです。
たとえば次のようなコマンドです。
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf-20xx0101
このようなコマンドは次のように短縮化できます。
cp /etc/httpd/conf/httpd.conf{,-$(date +%Y%m%d)}
grepで「-v」を複数指定する
grepで複数の文字列を除外対象にしたい場合パイプで繋げていくと冗長になってしまいます。
grep -v hoge /foo/bar | grep -v fuga
このような場合は「-e」オプションを使います。次のようにします。
grep -v -e hoge -e fuga /foo/bar
あるいは次のようにするとすっきりします。
grep -v ‘hoge\|fuga’ /foo/bar