シェル・ワンライナー160本ノック 0日目

1年以上前に購入したこちらの本を全くやっていなかったので、改めて開始します。本書は、1日1問ペースで160日間、つまり160問があるので、半年以内に終わる計算です。

0日目となっているのは書籍で言うと前準備に相当する部分をやってみるためです。

準備

1問目に入るまでに準備しておくこと。

shell

本書では、シェルはbashを使用する想定になっているが、私が普段zshを使用しているため、無視してzshを使用することにします。(この辺り、後々問題が出そうな気もするが気にしないでおく)

必修コマンド

本書では、1問目に入る前に最低限使えておいた方がよいコマンドが紹介されるので、それらを改めて復習します。

| (パイプ)

|を使うと、コマンドの結果を別のコマンドの入力に使用することができます。

$ echo '1+1' | bc
2

> (リダイレクト)

>を使うと、コマンドの結果をファイルに記述することができます。

$ echo '1+1' | bc > a
$ cat a
2

man

manは各コマンドのマニュアルを見ることができます。

$ man ls

sed

sedは置換コマンドです。基本的な使い方はsed 's/置換前/置換後/'です。

# aをbに置換するコマンド
$ echo 'aabb' | sed 's/a/b/'
babb

上記では最初に発見した置換対象文字のみが置換対象となるため、すべての文字を置換する場合は末尾にgをつけます。

# aをbに置換するコマンド
$ echo 'aabb' | sed 's/a/b/g'
bbbb

&

sedコマンドでは、&は検索対象の文字を再利用することを表します。
aという文字を&&&にするため、aaaaに置換されたものが結果となります。

$ echo 'aabb' | sed 's/a/&&&/g'
aaaaaabb

-E

-Eオプションを付けると拡張正規表現が使えます。 (これはそのうちやる)

grep

grepコマンドは検索を行うことができます。(ここで、xargsは出力を横に並べるためのものです)

$ seq 100 | grep "0" | xargs
10 20 30 40 50 60 70 80 90 100

書籍内では正規表現を利用した色々な書き方が載っていましたが、割愛します。

awk

書籍によれば

grepにプログラム機能をつけたもの

ということらしい。
以下の様に書くと、seqで表示される1 ~ 5のうち、偶数である2, 4のみが表示される様になる。

$ seq 5 | awk '$1%2==0'
2
4

パターンとアクション

awkでは、条件をパターン、処理をアクションと呼びます。
以下の例では、$1%2==0がパターン、{print($1, "偶数")}がアクションとなります。 また、パターンとアクションの組をルールと呼ぶそうです。

$ seq 5 | awk '$1%2==0{print($1, "odd")}'
2 odd
4 odd

BEGINとEND

BEGIN, ENDを用いることで、awkが1行目の処理を始める前と、最終行の処理を終えた後の状況で行いたい処理を実施できます。

$ seq 5 | awk 'BEGIN{print("begin!")}$1END{print("end!")}'
begin!
1
2
3
4
5
end!

xargs

xargsを使うと、指定したコマンドに引数を渡して実行することができます。
以下は、1 ~ 5ディレクトリを作成します。

$ seq 5 | xargs mkdir
$ ls -l
total 20
drwxr-xr-x 2 root root 4096 Dec 21 01:09 1
drwxr-xr-x 2 root root 4096 Dec 21 01:09 2
drwxr-xr-x 2 root root 4096 Dec 21 01:09 3
drwxr-xr-x 2 root root 4096 Dec 21 01:09 4
drwxr-xr-x 2 root root 4096 Dec 21 01:09 5

0日目の感想

知っているコマンドもあったものの、改めて学び直すと色々な使い方があって楽しい。 正規表現を最近使用していなかったので、思い出しつつやらないとなかなか厳しいかもしれない。

それでは次回から問題を解いていきます。