Bashワンラインの備忘録

はじめに

使えそうな技があれば、備忘録として随時追加していきます。

ワンライナーとは

ログ調査など、スクリプトを書くほどではないが、複雑な処理が必要なときに1行でコマンドを書く人のことです。

コマンドの繋げ方

| パイプ

パイプはcommand1の出力をcommand2に渡すことができます。

command1 | command2
cat hogehoge.txt | awk -F ',' '{print $2}' | ...

; セミコロン

command1の成功可否に関係なくcommand2を実行します。

command1 ; command2
cd /var/log ; move messages messages.1.gz

&& 論理積

command1が成功したときのみ、command2を実行します。 command1 成功時:$? の戻り値が0

command1 && command2
cd /var/www/old/ && rm -f index.html.old

|| 論理和

command1が失敗したときにcommand2を実行します。 comannd1 失敗時:$? の戻り値が1 comannd2 成功時:$? の戻り値が0

command1 || command2
cat hogehoge.txt || touch hogehoge.txt

xargs -I {}

command1 で実行した出力をcommand2の引数として実行できます。

command1 | xargs -I{} comannd2 {}
find /var/www/ -name *php | xargs -I{} cp -p {} /tmp/php/

ループ処理

while read line

ヒアドキュメント(<)に指定したファイルを1行ずつ読み込みcommand1処理を実行します。

while read line ; do [command] ;done < 標準出力、ファイルパス
while read line ; do cp -p ${line} /tmp/php/ ;done < <(find /var/www/ -name *php)
find /var/www/ -name *php | while read line ; do cp -p ${line} /tmp/php/ ;done

while :; do [command] ; done

watchコマンドが使えないときや、一定の時間間隔でデータを取得したいときに便利です。

while :; do echo "(」・ω・)」うー!(/・ω・)/にゃー!” ; sleep 1 ; done

1秒ごとに(」・ω・)」うー!(/・ω・)/にゃー!を実行します。 (無限に実行します。whileの条件が「:」のため)

for i in ; do [command] ; done

1[n]秒ずつコマンドを実行し、指定した回数繰り返します。

for i in [1..100] ; do echo "(」・ω・)」うー!(/・ω・)/にゃー!" $i; sleep 1 ; done

awkコマンドのワンライン化

通常のawkプログラム

BEGIN { はじめの処理 }
特定のレコード条件1 { 処理 }
特定のレコード条件2 { 処理 }
特定のレコード条件3 { 処理 }
...
END { さいごの処理 }

awkプログラムをワンラインで書く

awk 'BEGIN{ はじめの処理 } 特定レコードの条件n { 処理 } END{ さいごの処理 }'