シェルワンライナー ~シェル芸を極める道~ 1歩目

1+1の計算

bcは計算するコマンドで | で左の1+1の結果をbcに渡している

[opc@linux ~]$ echo '1+1' | bc
2
[opc@linux ~]$ 

ファイルへの保存

>記号を使うことで計算された値をaに書き込む(リダイレクトする)

[opc@linux ~]$ echo '1+1' | bc > a
[opc@linux ~]$ cat a
2
[opc@linux ~]$ 

ファイルのパーミッション

chmod -r [ファイル名]とすることで読み込み出来なくしています。
読み込めるようにするにはchmod +r [ファイル名]とすることで読み込めます。

[opc@linux ~]$ chmod -r a
[opc@linux ~]$ cat a
cat: a: Permission denied
[opc@linux ~]$ chmod +r a
[opc@linux ~]$ cat a
2
[opc@linux ~]$ 

sedによる置換の練習

問1.最初の「エチル」を「メチル」に置換する。
期待する出力結果:クロロメチルエチルエーテル
[opc@linux ~]$ echo クロロエチルエチルエーテル |sed 's/エ/メ/'
クロロメチルエチルエーテル
[opc@linux ~]$ 
問2.「エチルエ」を「エチルメ」に置換する。
期待する出力結果:クロロエチルメチルエーテル
[opc@linux ~]$ echo クロロエチルエチルエーテル |sed 's/エチルエ/エチルメ/'
クロロエチルメチルエーテル
[opc@linux ~]$ 
問3.全ての「メ」を「エ」に置換する。

その場合「g」を付ける。

期待する出力結果:クロロエチルエチルエーテル
[opc@linux ~]$ echo クロロメチルメチルエーテル |sed 's/メ/エ/g'
クロロエチルエチルエーテル
[opc@linux ~]$ 
問4.「エチル」を「エチルエチル」にする

sed 's/エチル/エチルエチル/' でも良いが、&&でも同じ意味になる。
&は「エチル」を指すので「エチルエチル」にするには「&&」となる。

期待する出力結果:クロロエチルエチルエーテル
[opc@linux ~]$ echo クロロエチルエーテル | sed 's/エチル/&&/'
クロロエチルエチルエーテル
[opc@linux ~]$ 
問5.「メチル」と「エチル」を入れ替える。

オプション-Eを利用し、置換対象部分に()で文字を入れると順番に番号を与えられるのでその番号を使って入れ替える。

[opc@linux ~]$ echo クロロメチルエチルエーテル | sed -E 's/(メチル)(エチル)/\2\1/'
クロロエチルメチルエーテル
[opc@linux ~]$ 

grepによる検索の練習

問1.0が1文字でもある場合の検索方法
[opc@linux ~]$ seq 100 | grep 0 | xargs
10 20 30 40 50 60 70 80 90 100
問2.行の先頭が8で始まる場合の検索方法
[opc@linux ~]$ seq 100 | grep '^8' | xargs
8 80 81 82 83 84 85 86 87 88 89
問3.行末が8で終わる場合の検索方法
[opc@linux ~]$ seq 100 | grep '8$' | xargs
8 18 28 38 48 58 68 78 88 98
問4.8が付く2桁以上の場合の検索方法
[opc@linux ~]$ seq 100 | grep '8.' | xargs
80 81 82 83 84 85 86 87 88 89
問5.1で始まり0が0個以上続く場合の検索方法
[opc@linux ~]$ seq 100 | grep '^10*$' | xargs
1 10 100
問6.偶数のみ検索する方法

[02468]$はの中に書いた時のどれか1文字を表します。
そして$で行末が
の中の書いた文字という意味になります。

[opc@linux ~]$ seq 100 | grep '[02468]$' | xargs
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
問 7.基数のみ検索する方法

問6に^を付けることでことで奇数のみとできます。^は中に書いた文字以外となります。

[opc@linux ~]$ seq 100 | grep '[^02468]' | xargs
1 3 5 7 9 10 11 12 13 14 15 16 17 18 19 21 23 25 27 29 30 31 32 33 34 35 36 37 38 39 41 43 45 47 49 50 51 52 53 54 55 56 57 58 59 61 63 65 67 69 70 71 72 73 74 75 76 77 78 79 81 83 85 87 89 90 91 92 93 94 95 96 97 98 99 100
問 8.ゾロ目を検索する方法

^(.)は先頭の文字に番号を付けます。\1で再度^(.)で取得した値を繰り返します。
最後に$をつけることで行末指定をします。

[opc@linux ~]$ seq 100 | grep -E '^(.)\1$' | xargs
11 22 33 44 55 66 77 88 99
問 9.田で終わる文字を検索する方法

grep -o "[^ ]田"でスペースではない1文字の後ろに田が付くものを検索している

[opc@linux ~]$ echo 中村 山田 田代 上田 | grep -o "[^ ]田"
山田
上田