支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • シェルプログラミングを学ぼう

はじめに

Linuxを使ったシェルプログラミングを学びたいという方はいらっしゃるでしょう。 ただどんな場面でシェルプログラミングを使うのか、という疑問をお持ちの方もいるのでは無いでしょうか?実際、シェルプログラミングはどんな現場でもそこで運用されているシステムのOSがLinuxだった場合は必ず使うことになります。システムを自動化させるためのバッチ処理を開発する場合に使われたり、システムを運用、保守する場合にも監視用のツールなんかを作る場合などもあるかことでしょう。 そんなシェルプログラミングですが、個人的にはテキストを操作するコマンドを使ったプログラムをよく目にします。catやgrep、sed、awkなどです。本記事ではシェルプログラミングの基本となるテキストの操作コマンドを2、3個紹介します。きっと現場でも良く見かけるコマンドとなりますので、是非参考にして頂けたら幸いです。

シェルプログラミングを学ぶ

では、さっそくシェルプログラミングがどういうものか見ていきましょう。 私の使っているLinux環境は、WindowsのWSLを使ったものとなります。 Windowsしか持っていない方や仮想マシンを立てたいと考えている方は、WSLを使うのも良いでしょう。 参考URLに乗せておくので、必要であれば是非インストールしてみてください。 5分程でLinuxがWindows上で動かせるようになりますので、環境が無い方もすぐにシェルプログラミングを始めることができます。中には使えないコマンドもありますが基本的なコマンドは概ね使用できます。

cat

ではまず初めにcatコマンドを見ていきます。 catコマンドは、ファイルの中身を確認することができます。 書き方は以下になります。


cat [オプション] ファイル名


実施した結果が以下になります。


xxxxx@xxxxx:~$ cat file_1
11111111111
22222222222
33333333333
xxxxx@xxxxx:~$


catにはもう一つ使い方があって、複数のファイルを結合させることができます。
書き方は以下になります。


cat [オプション] ファイル名 ファイル名


実施した結果は以下になります。


xxxxx@xxxxx:~$ cat file_1 file_2
11111111111
22222222222
33333333333
4444444444444444444
5555555555555555555
6666666666666666666


xxxxx@xxxxx:~$


file_1とfile_2のファイルの中身が連結されています。
オプションでは以下が用意されています。
-n:行番号を表示する
-b:空白行を飛ばして行番号を表示する
-A:非表示文字を表示する
-s:連続した空白行を1行にする
-E:各行の最後に"$"を付加する


-nオプションを使って行番号を取得してみましょう。


xxxxx@xxxxx:~$ cat -n file_1 file_2
1 11111111111
2 22222222222
3 33333333333
4 4444444444444444444
5 5555555555555555555
6 6666666666666666666
7
8
xxxxx@xxxxx:~$


行番号が取得されました。
行番号が取得できるのは大変便利です。 例えば、ファイルの全体の行数を取得したい場合や、CSVのファイルを処理したい場合など処理対象とする行数を指定できるようになります。

-bオプションを使ってみます。


xxxxx@xxxxx:~$ cat -b file_1 file_2
1 11111111111
2 22222222222
3 33333333333
4 4444444444444444444
5 5555555555555555555
6 6666666666666666666


xxxxx@xxxxx:~$


-bを使えば空白行を除いたデータ件数を取得できます。
-Eオプションも使ってみます。


xxxxx@xxxxx:~$ cat -E file_1 file_2
11111111111$
22222222222$
33333333333$
4444444444444444444$
5555555555555555555$
6666666666666666666$
$
$
xxxxx@xxxxx:~$


どういう場合に使うかと言うと、
文字列の最後の$(ドルマーク)を置換対象文字とさせ、後続のコマンドや処理で 一律任意の値に変換させることが可能になります。

以上がcatになります。 色々と便利なオプションがありました。

paste

次にpasteを見ていきます。 pasteコマンドは、横方向にファイルを連結させることができます。 以下書き方となります。


paste ファイル1 ファイル2


実施した結果が以下になります。ファイルはcat実施時と同じファイルを使っています。


xxxxx@xxxxx:~$ paste file_1 file_2
11111111111 4444444444444444444
22222222222 5555555555555555555
33333333333 6666666666666666666


xxxxx@xxxxx:~$


横に結合されています。
二つ以上のファイルも半角スペースでつないで結合できます。 書き方は以下になります。


paste ファイル1 ファイル2 ファイル3 ファイル4


オプションは以下になります。
-d:結合文字(デリミタ)を指定する。※デフォルトでは、デリミタはタブに設定されている。
-s:結合したものの行列を入れ替える。


では、オプション-dを使ってみます。
実行した結果は以下になります。


xxxxx@xxxxx:~$ paste -d , file_1 file_2
11111111111,4444444444444444444
22222222222,5555555555555555555
33333333333,6666666666666666666
,
,
xxxxx@xxxxx:~$


今回は.「カンマ」区切りで連結してみました。
-sオプションも使ってみます。
実行した結果は以下になります。


xxxxx@xxxxx:~$ paste -s file_1 file_2
11111111111 22222222222 33333333333
4444444444444444444 5555555555555555555 6666666666666666666
xxxxx@xxxxx:~$


行列が入れ替わっています。
ちなみに-dと-sを組み合わせて使うこともできます。


xxxxx@xxxxx:~$ paste -d , -s file_1 file_2
11111111111,22222222222,33333333333
4444444444444444444,5555555555555555555,6666666666666666666,,
xxxxx@xxxxx:~$


以上がpasteコマンドになります。
これも形式の違うファイルをCSV形式のファイルに整形して出力させたりなど、 色々とできそうなコマンドです。

grep

では次にgrepコマンドを見ていきます。 grepコマンドはファイルの中の文字列を検索することができます。 検索する文字列は正規表現で指定します。 grepを使ってフォルダ内のファイルを纏めて検索するケースを現場でも良く見かけました。 書き方は以下になります。


grep 検索正規表現 ファイル名


先程と同じfile_01、file_02を対象に「1」の数字があるか検索してみます。


xxxxx@xxxxx:~$ grep 1 *
file_1:11111111111
xxxxx@xxxxx:~$


ファイル名はすべてである*「アスタリスク」を指定しています。 もちろん、個別にファイル名を指定することも可能です。
正規表現で記載した場合は、以下になります。


xxxxx@xxxxx:~$ grep -E ^[0-9]+$ *
file_1:11111111111
file_1:22222222222
file_1:33333333333
file_2:4444444444444444444
file_2:5555555555555555555
file_2:6666666666666666666
xxxxx@xxxxx:~$


先走ってオプション-Eをつけていますが、 これは拡張正規表現を使う場合に使用します。 というのも最初+「プラス」を入れても、うまく検索できず、少々ハマってしまいました。 +プラスは拡張正規表現に含まれるためオプションを入れてあげなければならないようです。 ちなみに上記正規表現の意味は、
0~9の数字から始まり、0~9の数字が一個以上続き、0~9の数字で終了する。
という意味になります。
オプションは以下が用意されています。
-i:大文字と小文字を区別せず検索する
-e:一致処理に指定した正規表現を使う
-v:一致しないものを検索する
-n:検索結果に行番号を表示する
-l:検索結果にファイル名のみ表示する
-h:検索結果にファイル名を表示しない
-o:検索結果に一致した文字を表示する
-C:検索結果に一致した箇所から前後に指定した行数表示する
-r:ディレクトリ内も検索対象とする
-L:検索した結果、該当しなかったファイルを表示する


いくつか掻い摘んで実行しています。
-vオプションを使ってみます。 ちなみにfile_3を追加しています。 ここにはアルファベットを記載しています。 実行結果は以下です。


xxxxx@xxxxx:~$ grep -Ev ^[0-9]+$ file*
file_3:abcde
file_3:fghuj
file_3:jijkl
xxxxx@xxxxx:~$


fileから始まるファイルを対象に、数字以外の文字を検索してヒットしました。

-lオプションを使ってファイル名のみ取得しましょう。
実行結果は以下です。


xxxxx@xxxxx:~$ grep -E -v -l ^[0-9]+$ file*
file_3
xxxxx@xxxxx:~$


先程と同じ記述で-lを付け加えただけなので、 アルファベットが記載されているfile_3のみ取得されました。

次に-hオプションを使ってファイル名は表示させないようにしましょう。
実行結果は以下です。


xxxxx@xxxxx:~$ grep -E -v -h ^[0-9]+$ file*
abcde
fghuj
jijkl
xxxxx@xxxxx:~$


検索された文字列のみが取得されました。


以上がgrepコマンドとなります。
grepもまた色々なことができそうなコマンドです。 例えば、検索したい文字列があるファイル名を検索して、 対象ファイル名を他のプログラムに渡して処理させたりなどに 使えます。

最後に

いかがでしたでしょうか? あまり多くは紹介できませんでしたが、 上記は現場でよく見かけるコマンドになり、シェルプログラミングの基本のコマンドです。 また別の機会にawkやsedなども紹介します。 以上となります。