シェル(4章)

4章の学習を進める前に

ポイント


4章の学習を進める前に、シェルについて振り返っておきます。
研修では、CentOSというLinuxディストリビューションを利用していますが、このCentOSのデフォルトのシェルが
bash(Bourne Again Shell)です。bashには以下の特徴があります。

• shを基本として機能を拡張したシェル(shと後方互換性を持つ)
• 多くのLinuxディストリビューションでデフォルトのログインシェル
• シェルスクリプトにも適している

シェルの機能は実際には多岐にわたっています。各章で学習する以下の機能がシェルによって提供されています。

  • 1章
  •   • ファイル名やコマンドなどの入力時の補完機能( [Tab]キーによる補完)
      • 入力履歴の保持と呼び出し(コマンドヒストリ)

  • 4章
  •   • 環境変数、シェル変数の設定、参照
      • コマンドやオプションの組み合わせに別名をつけてエイリアスとして登録し、呼び出して実行
      • プログラムの出力の切り替え(リダイレクト)と入力の切り替え(パイプ)
      • *や?などを力コマンドライン中で指定した特別な意味を持つ記号を、ファイル名やテキストファイル内の文字
    列とパターンマッチさせる(ワイルドカード展開)

  • 5章
  •   • プログラムの起動と終了
      • プロセスやジョブの制御

  • 6章
  •   • 事前にファイルに登録されたまとまったコマンドをシェルスクリプトとして実行
      • コマンドの繰り返し実行や、条件に応じた実行をするための制御構

標準入出力とパイプライン

標準入力、標準出力、標準エラー出力


Linuxでは、catなどの何らかのコマンドを実行すると、自動的に標準的な入出力の「チャネル」が開かれます。
チャネルとは、データの通り道のようなものです。
標準的な入出力のチャネルには、以下があります。

  • 標準入力(stdin)
  •   標準的な入力(通常はキーボード)

  • 標準出力(stdout)
  •   標準的な出力(通常はディスプレイ)

  • 標準エラー出力(stderr)
  •   エラーメッセージの標準的な出力(通常はディスプレイ)

これらの3つを、標準入出力と呼びます。各コマンドは、特に指定をしない限りは、標準入力から入って
きたものを処理して、正常に終了している場合は標準出力に出力し、処理がエラーを起こした場合は標
準エラー出力に出力しています。

コマンドの入出力を「標準入出力」という形式に抽象化するのは、一見わかりにくいように感じますが、こ
のようにするとコマンドの内部動作を変更せずに標準入出力を変更できます。たとえば、標準入力をキー
ボードからファイルに切り替えたり、標準出力をディスプレイからファイルやプリンタに切り替えることが簡単に
できます。

リダイレクト


た、「標準入出力を切り替える機能」のことを、リダイレクトといいます。
標準入力をリダイレクトするには、< 、標準出力をリダイレクトするには > 記号を使用します。

以下のコマンドを実行し、リダイレクトの方法を確認しましょう。
1. カレントディレクトリをホームディレクトリに変更します。
  $ cd

2. lsコマンドの実行結果を、画面ではなくファイルに出力してみましょう。
  $ ls –l > lsout.txt

3. 実行結果がファイルに出力されたことを確認します。
  $ cat lsout.txt

4. リダイレクト先に指定したファイルに、別のコマンドの実行結果を追記したい場合は、リダイレクト記号>を2回続けて入力しま
  す
  ==================
   リダイレクト先ファイルがすでに存在する場合、 >は上書き、>>は追記になります)。
  ==================
  $ ls >> lsout.txt

5. 手順4の実行結果がファイルに追記されたことを確認します。
  $ cat lsout.txt


1. Linuxに登録されているユーザを一覧で確認したいが、ユーザが登録されているファイル(passwd)がどのディレクト
  リに保存されているかを忘れてしまったためfindコマンドで探したいと考えています。
  findコマンドを実行し、ルートディレクトリ以下の全ディレクトリを検索します。
  $ cd
  $ find / -name passwd

2. 手順1では、パーミッションで許可されていないファイルまで検索しようとしたため、エラーメッセージが大量に表示されてし
  まいました。
  そこで、以下の手順a~eを実行し、自分のほしい結果だけを画面やファイルに出力できるように、リダイレクト機能で
  制御します。

  a. 正常な結果の出力を、ファイル list.txt に切り替えて後で確認できるようにしたい
    ※この場合は標準エラー出力は画面に、標準出力はlist.txtに出力されます
    $ find / -name passwd > list.txt
    $ cat list.txt
※正常な検索結果のみlist.txtに保存されている

  b. エラー結果の出力を、ファイル err.txt に切り替えて後で確認できるようにしたい
    ※この場合は標準出力は画面に、標準エラー出力はlist.txtに出力されます
    $ find / -name passwd 2> err.txt
    $ cat err.txt

  c. 標準出力と、エラー結果の出力を、まとめて ファイル list2.txt に保存したい
    $ find / -name passwd > list2.txt 2>&1 ※次ページ参照

  d. 正常な結果はlist.txt、エラーはerr.txtに出力し、画面にはどちらも表示しない
    $ find / -name passwd > list.txt 2> err.txt

  e. エラー結果をどこにも出力せずに、正常な結果のみ画面に表示したい
    $ find / -name passwd 2> /dev/null  ※次ページ参照

リダイレクト機能を使えば正常な処理結果とエラー処理結果を分けて画面やファイルに出力することができることを覚えておきましょう。
上記のようなパターンを覚えておけば、状況に応じた使い分けができます。


Linuxでは、リダイレクト先に /dev/null というファイルが良く使用されます。
/dev/null は、スペシャルファイルと呼ばれる特別なファイルで、以下のような性質があります。

  

  

      

  • 入力元として指定すると、何も入力されない
  •     コマンドのテストなどで、入力を空にしたい場合などに利用

      

  • 出力先として指定すると、どこにも保存、出力されずに消えてなくなる
  •     エラーメッセージを表示させたくない場合などに利用
      

  

とくに出力先に/dev/nullを指定すると、あらかじめわかっている不要なメッセージを非表示にできるため、便利で
す。

また、標準出力と標準エラー出力の両方を同じファイルにリダイレクトする場合は、リダイレクト先の指定を
> ファイル名 2>&1」と指定します。
これは、標準出力をファイル名 にし、標準エラー出力を標準出力と同一にする、と解釈され、結果として標準出
力と標準エラー出力の出力先が同じファイルになります。

teeコマンド


リダイレクトは「切り替える」機能のため、画面にもファイルにも出力する、ということはできません。このような場合は、tee
コマンドを使用します。

たとえば、ls –l コマンドの実行結果を、画面表示と同時にカレントディレクトリにもファイルとして保存する場合は、以下
のようにコマンドを実行します。
$ ls –l | tee kekka.txt

上記の例では、ls -l コマンドの実行結果を、teeコマンドに引き渡して、teeコマンドが画面とファイル(kekka.txt)
に出力を行っています。

==============================
One Point

パイプライン
このように、あるコマンドの実行結果を、別のコマンドに引き渡して処理を行うことを「パイプライン」といいます。
パイプライン機能はシェルによって提供されています。
次ページからはこのパイプライン機能について学習します。
==============================

パイプライン


複数のコマンドを連携させると、コマンドの実行結果を加工し、思い通りの結果を取り出すことができます。
これには、あるコマンドの標準出力を、別のコマンドの標準入力につなぐ「パイプライン」という機能を利用します。

1. たとえば、ls -l コマンドで/etc(ルートディレクトリ直下のetcディレクトリ)の中を表示し、その結果をlessコ
  マンドで1ページずつ確認する場合は、以下のようにコマンドを実行します。
  $ ls –l /etc | less

*************************************
lessコマンドにパイプラインで実行結果を渡すのは、実行結果が大量に表示される場合によく利用される手法で
す。
*************************************

このように、 Linuxではコマンドをパイプラインでつないでいくことで、コマンドを部品のように扱い、複雑な処理が行
えるようになっています。

組み合わせの実行例


/binディレクトリの中に保存されているファイルやディレクトリをサイズ順に並び替えて、トップ5行のみを表示す
る場合は、以下のように入力します。
$ du -b /bin/* | sort -n | tac | head -n 5

なお、上記の例は以下のように簡略化できます。sort –nは、数値を基準に小さい順に並び替えますが、r オプ
ションを付けると大きい順に変更できるので、tacコマンドが不要になります。
$ du -b /bin/* | sort –nr | head –n 5

または、sort –nで数値を基準に小さい順に並び替え、tail -n 5で下位5行を表示する方法もあります。
$ du -b /bin/* | sort -n | tail -n 5

wcコマンド


wcコマンドは、入力ファイルの行数・単語数・バイト数を数えるコマンドです。パイプラインでつなげると、別のコマンドから
渡された実行結果の行数・単語数・バイト数を数えることができます。

wcコマンドを単体で利用する例は以下の通りです。

1. /etc/passwdファイル内の行数を表示します。
  $ wc -l /etc/passwd

2. /etc/passwdファイル内の単語数を表示します。
  $ wc -w /etc/passwd

3. /etc/passwdファイルのサイズ(バイト数)を表示します。
  $ wc -c /etc/passwd

wcコマンドをパイプラインと併用する例は、次の通りです。

1. ルートディレクトリ直下のファイルとサブディレクトリの数をカウントする場合は、以下のようにコマンドを実行しま
す。
  $ ls / | wc -l


<練習問題>

上記の例を参考に、user01のホームディレクトリにあるsampleサブディレクトリには、fileで始まるファイル名のファイ
ルがいくつあるかをカウントしてください。

sortコマンド


sortはコマンドは、文字通り並び替えを行うコマンドです。文字や数値を基準に並び替えを行うことができます。

sortコマンドを単体で利用する例は以下の通りです。

1. file1内のデータをアルファベット順にソート
  $ cd ~/sample
  $ sort file1

2. file1内のデータを逆順にソート
  $ sort -r file1

3. number.txt内のデータを数値順(昇順)にソート
  $ sort -n number.txt

4. number.txt内のデータを数値順(降順)にソート
  $ sort -nr number.txt

sortコマンドをパイプラインと併用する例は、次の通りです。

1. 各ユーザのホームディレクトリの使用量を、昇順に表示する場合は、以下のようにコマンドを実行します。
  $ su ※全ユーザのディレクトリの使用量の確認には管理権限が必要です(パスワードは
   root)
  # du -s /home/* | sort -n  ※ -sは、ファイルやディレクトリの総計を表示するためのオプション
  # exit

uniqコマンド


uniqコマンドは、連続した重複行を取り除くコマンドです。このため、あらかじめ対象となるファイルの内容はソートさ
れている必要があります。

1. 内容がソートされていないファイル(file3)は、以下のようにsortコマンドでソートし、結果をパイプラインで受
け取ってuniqコマンドで重複行を除きます。
  $ cd ~/sample
  $ sort file3 | uniq

2. -cを追加すると、重複行数をカウントできます。
  $ sort file3 | uniq –c
    1 ※この行は空白行
    1 Aoyama
    2 Ginza      ※Ginzaが2回重複(あとは重複していない)
    1 Ikebukuro
    1 Ikefukuro
    1 Kinza
    1 Kototoibashi
    1 Kyobashi

3. 【練習問題】
  2.の結果をさらにソートし、重複行数の多い順に表示してください。

cutコマンド


cutコマンドは、指定された一部の列を切り出して表示するコマンドです。
列を区別するために、列を区切る記号(デリミタ)と、何列目の値を切り出して表示するかを指定します。

たとえば、Linuxのユーザが登録されている/etc/paswdファイルを表示すると、以下の順番で1ユーザが1行で記録さ
れています。各情報(列)は、「:」で区切られています。

< /etc/paswdファイルに記録される情報>

列 項目
-----------------------------------------------------
1. ユーザー名
2. パスワード(本当のパスワードではなくダミーの情報)
3. ユーザー ID (UID)
4. ユーザーのグループ ID (GID)
5. コメント(フルネームなど)
6. ホームディレクトリ
7. ログインシェル

たとえば、Linuxに登録されているユーザのユーザ名、ホームディレクトリ、ログインシェルの一覧を取得したい場合は以
下のようにコマンドを実行します。
/etc/passwdの1,6,7番目のフィールドを切り出して表示(区切り記号「:」)
$ su   ※パスワードはroot
# cut -d : -f 1,6,7 /etc/passwd
# exit

headコマンド、tailコマンド


headコマンドは、ファイルの先頭行を表示するコマンドです。また、tailコマンドは、ファイルの末尾の行を表示するコ
マンドです。
テキストファイルの内容の一部の行や、パイプで渡された実行結果の一部の行を表示するときに利用します。

【練習問題】

1. 上記の例を参考に、sort file3 | uniq -c コマンドの実行結果を、重複行数の多い順にソートし、上位2
  位(1行目と2行目)を表示してみましょう
  (file3 は、user01のホームディレクトリのsampleサブディレクトリ内にあります)。
 
 

2. 上記の例を参考に、sort file3 | uniq -c コマンドの実行結果を、重複行数の少ない順にソートし、下位3
  位(下から1~3行目)を表示してみましょう

trコマンド(参考)


trコマンドは、指定した文字の変換や削除を行うコマンドで、catコマンドやlsコマンドなどのほかのコマンドの実行結
果をパイプで受け取って処理を行います。

1. abc を ABCに置換
  $ cat /etc/passwd | tr abc ABC

2. ホームディレクトリのsampleサブディレクトリにあるname.txtをcatで表示した結果を、小文字から大文字に
  置換します。
  ※2.~5.のカレントディレクトリは、すべて~/sampleとします。
  $ cd ~/sample
  $ cat name.txt | tr a-z A-Z

3. name.txtをcatで表示した結果を、大文字から小文字に置換します。
  $ cat name.txt | tr A-Z a-z

4. trコマンドでファイルを直接指定するとエラーになります。このため、ほかのコマンドからパイプで受け取る必要が
  あります。
  $ tr A-Z a-z name.txt

grepコマンド


grepコマンドは、テキストファイルやコマンドの実行結果の中の、条件にマッチした行のみを取り出すときに利用しま
す。
コマンドの由来はテキストエディタedのコマンド g/re/p です。g/re/pは、「Global Regular Expression
Print(ファイル全体から/正規表現に一致する行を/表示)」するときに指定するオプションです。

grepコマンドの利用例には、以下のような例があります。

1. /etc/passwdファイルから、文字列「bash」を含む行を出力
  条件で使用する文字列(この例ではbash)は大小文字を区別するので注意してください
  本コマンドでは、ログインシェルにbashが指定されているユーザが表示できます。
  $ grep bash /etc/passwd

2. ~/.bash_profile から、文字列「PATH」を含む行を行番号付きで出力
  $ grep -n PATH ~/.bash_profile

3. ~/sample/file1ファイルから、大小文字に関係なく、「ginza」を含む行を出力
  -iオプションは条件に使用する文字列の大小文字の区別をしないときに使用
  $ grep -i ginza ~/sample/file1

4. /etc/passwdファイルから、文字列「bash」を含まない行を出力
  $ grep -v bash /etc/passwd

==============================
OnePoint

/etc/passwd
例で使用している/etc/passwdは、Linuxに登録されたユーザの情報を保存してあるファイルです。Linuxでは、
どのようなユーザが登録されているかを確認する場合、このファイルを参照します。
==============================


grepコマンドは単体でも利用できますが、パイプでつなげることで、ほかのコマンドの実行結果のうち、条件に一致
した行だけを表示することができます。
たとえば、以下のような例があります。

1. ホームディレクトリの直下にあるサブディレクトリだけを表示
  (ls –lの実行結果から、先頭がdのものだけを表示)
  $ ls –l ~/ | grep ^d

2. /etc ディレクトリ配下のcronという文字列を含むファイル・ディレクトリを検索
  $ ls /etc | grep cron

==============================
One Point

手順2の例は、指定した日時にプログラムなどを自動実行するcronという機能に関連するファイルを検索していま
す。
「6.1 シェルスクリプト入門」で紹介しています。
==============================

diffコマンド(参考)


diffコマンドは、2つのファイルの差分を表示するコマンドです。変更前のファイルと変更後のファイルの差分を確認したい場合
や、コマンドの処理結果をリダイレクトしたファイルの比較などにも利用できます。
たとえば、設定ファイルやプログラムを記述したファイルの変更前と変更後のファイルを比較し、どこを変更したか?などを確認
できます。

1. ホームディレクトリにあるsampleサブディレクトリのfile2とfile3という2つのテキストファイルを比較する例を通じて、diffの
  使い方を確認しましょう。(カレントディレクトリは/home/user01/sample とします)
  $ cd
  $ cd sample
  $ diff file2 file3

  2c2 file2の2行目のKyobashiが、file3の2行目ではKototoibashiになっている
  < Kyobashi   ---   > Kototoibashi
  4a5 file2の4行目の後に、file3の5行目Kinzaが追加されている
  > Kinza
  6,8c7 file2の6行目~8行目がfile3の7行目Ikefukuroになっている
  < Ginza   < Ginza   < Ikebukuro   ---   > Ikefukuro

2. -yオプションを付けることで、見やすくすることができます。
  $ diff -y file2 file3
  Kyobashi         Kyobashi
  Kyobashi        | Kototoibashi
  Aoyama          Aoyama
  Ginza           Ginza
              > Kinza
  Ginza Ginza
  Ginza          | Ikefukuro
  Ginza          <   Ikebukuro        <   Ikebukuro         Ikebukuro [/st-cmemo]

bashの設定

エイリアス


エイリアスは、よく利用する既存のコマンドに別名をつけて利用する機能です。
たとえば、ls -F というコマンドを頻繁に利用する場合、ls -F を ls というエイリアス名で登録しておくと、lsとタイプす
るだけで ls -F が実行されるようになります。

パイプラインで複数のコマンドをつなげた長いコマンドも、エイリアスとして登録しておけば、簡単に実行することがで
き非常に便利です。

コマンドがエイリアスかコマンドのどちらなのかを調べる場合は、typeコマンドを利用します。

なお、コマンドと同じ名前のエイリアスがあった場合は、エイリアスのほうが優先されます。
本来のコマンドを優先して実行する場合は、以下のいずれかの手段が必要です。
  1. フルパスで指定する(/bin/ls)
  2. commandを使う (command ls)
  3. バックスラッシュを使う(¥ls : [¥]キーを押すと、バックスラッシュになります)

【練習問題】
1. 上図のaliasコマンドの書式を参考に、cat –nコマンドをcatnというエイリアス名で登録してください。
 
 
2. 以下のコマンドを実行し、エイリアスcatnが登録されていることを確認します。
$ alias
 
 
3. エイリアスcatnを実行し、name.txtファイルの内容の行頭に行番号が追加されることを確認してください。
$ catn ~/sample/name.txt

シェル変数の設定


シェル変数とは、シェル(本テキストではbash)内部で利用される変数のことです。
変数とは、数値や文字列を保存して、様々な値を設定するために利用します。

<シェル変数の例>
たとえば、Linuxをインストールするときに日本語環境を指定しておくと、メニューなどが自動的に日本語で表示されます。これ
は、LinuxにもともとLANGというシェル変数が登録されており、インストール時にシェル変数LANGの中に日本を示す文字列
(ja_JP.UTF-8)が指定されているためです。

  • シェル変数LANGの中に設定されている値を表示
  • $ echo $LANG

    シェルは、シェル変数の中に保存されている値を参照し、値が日本になっていれば日本語環境に切り替えます。
    現在は日本語環境がシェル変数LANGに設定されているため、エラーメッセージなども日本語で表示されます。
    $ cmd123
    bash: cmd123: コマンドが見つかりませんでした...
    ※現在は日本語環境のため、日本語でエラーメッセージが表示される

    あとからアメリカ英語環境(en_US.UTF-8)に切り替える場合は、LANGシェル変数の値を変更すれば、アメリカ英語環境
    に切り替えることができます。
    このように、変数を間に挟むことでより柔軟かつ便利に様々な設定を行うことができるようになります。

  • アメリカ英語環境に変更
  • $ LANG=en_US.UTF-8
    $ cmd123
    bash: cmd123: command not found...
    ※英語環境になったため、存在しないコマンドを入力すると英語でエラーメッセージが表示されるようになった

本設定は、現在実行中のシェルでのみ有効です。たとえば端末を閉じると本設定は消えて元の状態に戻るため、新たに端
末を開くと元の日本語環境に戻ります。シェル変数や環境変数の設定を永続的に利用する場合は、後述するbashの設定
ファイルに記述する必要があります。

よく使うシェル変数や環境変数


以下によく利用するシェル変数や
環境変数を紹介します(環境変数については、次ページ以降で説明します)。

 $HOME
  HOMEは、ホームディレクトリの絶対パスが登録されています。 echo(画面に文字列や数値、変数を表示
  する)コマンドで確認できます。
  $ echo $HOME
  /home/user01

  このため、以下のように指定すると、ホームディレクトリをカレントディレクトリにできます。
  ホームディレクトリのパスを「/home/user01」のように直接指定せずに、$HOMEを指定することで、どのよう
  な環境で、だれがログインしているかを気にすることなくホームディレクトリにカレントディレクトリを変更できます。
  $ cd $HOME

 $PATH
  PATHは、非常に重要なシェル変数です。
  ユーザが実行しているコマンドの多くは、プログラムファイル(コマンドの実体ファイル)として/binや/sbinなどの
  ディレクトリに保存されています。
  たとえば、cpコマンドは/usr/binに保存されているので、実行時には本来は/usr/bin/cpのように指定する必
  要があります。
  ところが、私たちはこれらのコマンドを実行するときにパスを指定していません。これは、あらかじめシェル変数
  PATHに、コマンドの保存されているディレクトリのリストが登録されており、シェルがこのリストをもとにコマンドの
  実体ファイルを探してくれているためです。PATHの内容を確認する場合は以下のようにコマンドを実行します。
  $ echo $PATH
  /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/user01/.local/bin
  :/home/user01/bin

  たとえば、自作のプログラムをコンピュータにインストールする場合、PATH変数にプログラムのインストール先ディ
  レクトリを登録すると、カレントディレクトリに関係なくプログラムを実行できるようになります。

環境変数


シェル変数と環境の主な違いは、各変数が使用できる範囲です。
シェル変数は、現在実行しているシェルの中だけで利用できます。
一方、環境変数は、新たなシェルを起動したり、コマンドを実行した場合にも継承されます。

==============================
One Point

シェル変数と環境変数の使用範囲の違いとシェルスクリプト
現時点では、本ページの内容は具体的なイメージがし難いかもしれません。
具体的な違いについては、6章でシェルスクリプトを学習するとき(「6.1.10 シェルとサブシェルの関係」、
「6.1.11 sourceコマンドの注意点」)などで確認できます。
==============================

環境変数の設定


現在シェルに設定されている環境変数を一覧表示する場合は、printenvコマンドを実行します。envは、
Environment Variable(環境変数)の略です。

環境変数の一覧は、printenvコマンドで表示できます。
$ printenv

環境変数を設定する場合は、exportコマンドを利用します。これは、指定したシェル変数を、環境変数にする、と
いうコマンドのため、exportコマンドの後にシェル変数名を指定します。

たとえば、環境変数TESTにを設定する場合の手順は以下の通りです。

<手順例1>
  ①シェル変数TESTに文字列abcdを指定
    $ TEST="abcde"
  ②シェル変数TESTを環境変数に指定
    $ export TEST

<手順例2>
  ①と②を1回で実行する場合は、以下のようにコマンドを実行します。
    $ export TEST="abcde"

bashの設定ファイル(参考)


bashをログインシェル(ログインしたときに起動されるシェルのこと)にした場合、まず「/etc/profile」が読み込まれ、次
に「~/.bash_profile」(ユーザのホームディレクトリにある隠しファイル)が読み込まれ、これらのファイルの内容が実
行されます。
bashの環境設定を行う場合は、これらのファイルをテキストエディタを使って編集します。

これらのファイルの違いは、/etc/profileがシステム全体(全ユーザ)に適用する設定であり、~/.bash_profileが
ユーザ固有の設定であるという点です。
また、多くのディストリビューションでは、~/.bash_profileの中に~/.bashrcというファイルがユーザのホームディレクトリ
にあれば読み込むように設定されています。この設定がある場合は、3つめの環境設定ファイルとして、~/.bashrcも自
動的に読み込まれます。
~/.bash_profileと~/.bashrcは、いずれもユーザのホームディレクトリに保存されている隠しファイルですが、両者の
違いは~/.bash_profileがログイン時にのみ自動的に読み込まれるのに対して、~/.bashrcはbashを起動するたび
に読み込まれます。

本章で学習したエイリアスやシェル変数などは、自分だけが利用する場合は~/.bashrcに記述しておくと、永続的に利
用ができるようになり便利です。環境変数は、プロセス間で受け継がれるため、 ~/.bash_profile か ~/.bashrcの
どちらに記述しても永続的に利用できます。

==============================
OnePoint

上記の設定ファイルを変更する場合は、既存のファイルをバックアップとして名前を変えてコピーしておき、編集に失敗し
たときにすぐに戻せるようにしましょう。たとえば ~/.bashrc を変更する前に、 ~/.bashrc.bakのようなバックアップで
あることがわかるような文字列や、 ~/.bashrc_210429などの、バックアップとしてコピーを行った年月日がわかるよう
な値を入れるなど、命名規則を決めておくと管理がしやすくなります。
==============================

正規表現

正規表現


正規表現(regular expression)は、条件に合致する文字列集合を表現するための記法です。
正規表現を利用すると、特定の条件に一致した文字や行を特定するための、パターンマッチングを行うことができ
ます。

以下の例では、lsコマンドとgrepを|(パイプ)でつなげていますが、正規表現を使ってlsコマンドの実行結果の
うち、「先頭がcronで始まる行」だけを表示しています。

なお、正規表現で使用する記号は、シェルにとっては別の意味を持つことがあります。シェルが勝手に記号を解釈
しないようにするには、(正規表現のメタ文字として扱うように)シングルクォートで囲みます。

$ ls /etc | grep '^cron'

正規表現の利用


正規表現を利用できる分野は広く、テキストエディタやlessコマンドで、/を入力して(ステータス行モード)テキスト検索を行う場合の検
索パターンとしても利用できます。また、sedコマンドやawkコマンド、findコマンドの条件として正規表現を利用し
ます。コマンドだけでなく、PerlやRuby、Javaなどの多くのプログラミング言語でも利用することができます。

文字を条件にするメタ文字


メタ文字とは、特別な意味を持つ記号のことです。
代表的なメタ文字には以下があります。

  .    任意の一文字
  [ ]   []の中に含まれるいずれかの1文字
  [^]   []の中に含まれていない、いずれかの1文字
  ¥    直後のメタ文字の意味を打ち消す

利用例は以下の通りです。
(例で使用しているexample.txtは、user01のホームディレクトリ内のsampleサブディレクトリにあります)

1. tで始まりdで終わる3文字を含む行を表示
  $ cd ~/sample
  $ grep 't.d' example.txt

2. aまたはdを含む行を表示
  $ grep '[ad]' example.txt

3. abcdのいずれかを含む行を表示
  $ grep '[a-d]' example.txt

4. t.を含む行を表示
  この場合、.(ドット)そのものを条件に利用するので、任意の位置文字を表すメタ文字として解釈されないよう
  に、¥を . の前に指定しています。
  $ grep 't¥.' example.txt

=====================
ASCIIコードの\(バックスラッシュ) は、日本語環境(JIS X 0201)では¥(円)記号のため、キーボードから
¥記号を入力すると、Linux上では\が表示され、Windows上では¥が表示されます。
=====================

位置を条件にするメタ文字


正規表現では、以下のメタ文字を利用し、位置を条件にすることもできます。
  ^ 特定の文字列で開始
  $ 特定の文字列で終了

利用例は以下の通りです。
(例で使用しているexample.txtは、user01のホームディレクトリ内のsampleサブディレクトリにあります)

1. eで始まる行のみを表示
$ cd ~/sample
$ grep '^e' example.txt

2. comで終わる行のみを表示
$ grep 'com$' example.txt

3. また、「^$」は空白行を表し、grep コマンドの 「-v」オプションは、以外 を表します。
以下の例では指定したファイル名の「空白行以外」を表示しています
$ grep -v '^$' <ファイル名>

【練習問題】

~/sample/name.txtファイルに含まれる空白行の行数を、正規表現とwcコマンドを組み合わせて数えてく
ださい。

高度なテキスト処理(参考)

~省略~

章末問題(MUST、SHOULD)

次の指示に従い、適切なコマンドを実行してください。

1. /home/user01/sample/file2から重複行を排除し、逆順(アルファベット順)に並び替えて、上位2行を表
示してください。
 
 
2. /home/user01/sample/file2から重複行を排除し、逆順(アルファベット順)に並び替えて、画面表示と同
時にファイルt1.txtに保存してください。
 
 
3. findコマンドを使って、/etc から拡張子が.txt(「ファイル名.txt」の形式で、ファイル名の部分は任意ですが、末
尾が.txtで終わっているファイルのことです)のファイルを検索してください。
 
 
4. 3.のコマンドを実行すると、パーミッションがないために「許可がありません」と表示されるファイルがありました。そこで、
リダイレクト機能を使ってこのようなエラーメッセージを表示させないようにしつつ、findコマンドで拡張子が.txtのファ
イルを検索してください(エラー結果をすべて非表示にします)。
 
 
5. 【SHOULD】 現在ログイン中のユーザが、過去に入力したコマンド履歴のうち、直近の5個を表示してください。
(コマンド履歴を表示するのはhistoryコマンドです)
 
 
6. 【SHOULD】 /home/user01/sample/log/web.logは、Webサーバのログファイル(いつ、どのようなクライ
アントがどのようなWebブラウザやOSを使ってアクセスをしてきたかを記録した履歴ファイル)です。
このファイルの末尾2行を表示してください(本コマンドは、サーバーでログファイル内の最新のログ(記録)をすば
やく確認するときによく利用します)。

-Linux入門

© 2021 スタートダッシュ