Bashでワンライナー(OneLiner)を利用する
ワンライナー(OneLiner)、つまり一行でbashのスクリプトを記述する。
基本的なこと
基本的にBashのスクリプトと同様。
ポイントは、以下の2点。
- コマンドの出力結果は、パイプ(|)を使うと、次のコマンドに渡すことができる。
- 別のコマンドを実行する場合は、セミコロン(;)でコマンドを区切る。
定期的に処理を実行
以下の例は、1秒間隔で5回、dateコマンドを実行する。
最初に、ループ用の変数iを初期化。
‘do’の後から、whileループ内で実行するコマンドを記述。
「dateコマンドの実行」「sleepコマンドの実行」「変数iのインクリメント」の3つを実行。
1 2 3 4 5 6 | -bash-3.2$ i=1; while [ $i -le "5" ]; do date; sleep 1; i=$(($i+1)); done Wed Jan 7 17:26:44 JST 2015 Wed Jan 7 17:26:45 JST 2015 Wed Jan 7 17:26:46 JST 2015 Wed Jan 7 17:26:47 JST 2015 Wed Jan 7 17:26:49 JST 2015 |
ファイルを検索して、各ファイルに処理を実行
以下の例は、検索したファイルにsedで置換処理をかける。
最初に’find’コマンドでファイルを絞り込み、その後に’for-in’でループして処理。
1 | -bash-3.2$ files=$(find . -name '*.java'); for file in $files; do sed -i '.bak' -e 's/foo/bar/g' $file; done |
‘grep’を使い、さらに絞り込むことも可能。
1 | -bash-3.2$ files=$(find . -name '*.java' | xargs grep 'foo'); for file in $files; do sed -i '.bak' -e 's/foo/bar/g' $file; done |
特定のファイルを全て削除する場合は、以下の通り。
1 | -bash-3.2$ files=$(find . -name '*.java' | xargs grep 'foo'); for file in $files; do rm $file; done |