2015/05/20

bashの小ネタ集

Bashの小ネタ集です。あるあるからなんじゃそりゃまで、小ネタのパラダイスとなっております。




スペースも何もない行をgrepする

grep "^$"

grep -v "^$"とすれば、空白行を排除できる。


bashでsubstr

bashにはsubstrというコマンドはないです。
なので、cutコマンドで対応します。
# "abcdefg"から先頭の3文字(abc)を取り出す
echo "abcdefg" | cut -c-3        #cut -c1-3でも可
abc

# "abcdefg"から4~6文字目(def)を取り出す
echo "abcdefg" | cut -c4-6
def

# "abcdefg"から1、3、6文字目(acf)を取り出す
echo "abcdefg" | cut -c1,3,6
acf

# ちなみに指定する順序が違っても出てくる文字列は同じ
echo "abcdefg" | cut -c1,6,3
acf

# 上を組み合わせてこんな事もできる
echo "abcdefg" | cut -c-2,5
abe

# こちらも指定の順序ではなく元の文字列の順序に準じる
echo "abcdefg" | cut -c5,1-4
abcde

ifの条件

ifの条件部分は[]やtestコマンドだけではなく、色んなコマンドを入れられる。
if echo "abcde" | grep "abc"; then
  echo "true"
fi

# ただ、上のスクリプトの結果は次のようになる
abcde
true

grepの結果も表示されているので、これをうまく排除する必要がある。以下修正版。
if echo "abcde" | grep "abc" > /dev/null; then
  echo "true"
fi

# 結果
true

要は、戻り値が0とか1になるコマンドならなんでもOKということで、grepは検索結果がヒットすれば行単位で表示するが、表示されないけれど終了ステータスも出力している。grepの場合は、ヒットした場合は0、ヒットしなかった場合は1を返す。

終了ステータスは0が正常、1が異常なので、一般的なif文とは逆のような感じではあるけれど、これはこういうもんです。


xargsで大量のファイルを移動する

引数の数が多すぎてエラーになるほど大量のファイルを移動したい場合は、xargsで一発。
find . -name "hoge*" | xargs -I{} mv {} /tmp

findでファイルを引っ掛けて、ファイル名をxargsに渡します。その後、xargsがファイル名を1つずつmvで移動するという寸法です。
mvに渡る引数は常に1ファイル分なので、シェルスクリプトでwhileを回しているような感じ。
xargsに関しては、エンジニアの数だけ使い方があると言っても過言ではない応用の効くコマンドです。

転ばぬ先の杖的なat

atコマンドはcronの影に隠れがちなコマンドですが、根本的に違うのは、1回きりの実行を時限爆弾のように仕込める事。
時間指定が少々お茶目(manページで微笑んでください)ですが、iptablesの設定を遠隔で行う時など、設定に失敗するとコネクションが張れなくなるような局面(限定的すぎる・・・)に使うのはどうでしょう。
iptablesはストップすると設定がクリアされるので、SSHを開け忘れたとか、全パケットを破棄するような何時使うのか分からないフィルタリングを設定してしまった場合、筐体が海外にあるとかは絶望的なのでぜひatコマンドでiptables stopをatコマンドに引っ掛けてから設定してテストしましょう。 → Man page of AT


思いついたら書き貯めてを繰り返し、ようやく数が出揃ったので放出。再びネタ集めの日々が始まります。
なんだかな~と思うネタからおおっと思うネタまで玉石混交ですが、探偵ナイトスクープの小ネタ集を目指して頑張ります。


see also:
BASHが好きになる! 13の便利なコマンド


0 件のコメント:

コメントを投稿