Unix-quick-guide

提供:Dev Guides
移動先:案内検索

Unix/Linux-クイックガイド

Unix-はじめに

Unixとは何ですか?

Unixオペレーティングシステムは、コンピューターとユーザーの間のリンクとして機能するプログラムのセットです。

システムリソースを割り当て、コンピューターの内部のすべての詳細を調整するコンピュータープログラムは、「オペレーティングシステム」または「カーネル」と呼ばれます。

ユーザーは、 shell と呼ばれるプログラムを介してカーネルと通信します。 シェルはコマンドラインインタープリターです。ユーザーが入力したコマンドを翻訳し、それらをカーネルが理解できる言語に変換します。

  • Unixはもともと1969年にAT&Tの従業員であるKen Thompson、Dennis Ritchie、Douglas McIlroy、およびBell LabsのJoe Ossannaによって開発されました。
  • 市場にはさまざまなUnixのバリアントがあります。 Solaris Unix、AIX、HP Unix、およびBSDがいくつかの例です。 LinuxはUnixのフレーバーでもあり、自由に利用できます。
  • 数人が同時にUnixコンピュータを使用できます。したがって、Unixはマルチユーザーシステムと呼ばれます。
  • ユーザーは複数のプログラムを同時に実行することもできます。したがって、Unixはマルチタスク環境です。

Unixアーキテクチャ

ここにUnixシステムの基本的なブロック図があります-

Unixアーキテクチャ

Unixのすべてのバージョンを統一する主な概念は、次の4つの基本です-

  • カーネル-カーネルはオペレーティングシステムの心臓部です。 ハードウェアや、メモリ管理、タスクスケジューリング、ファイル管理などのほとんどのタスクとやり取りします。
  • シェル-シェルは、リクエストを処理するユーティリティです。 端末でコマンドを入力すると、シェルはコマンドを解釈し、必要なプログラムを呼び出します。 シェルは、すべてのコマンドに標準構文を使用します。 Cシェル、Bourneシェル、Kornシェルは、ほとんどのUnixバリアントで利用できる最も有名なシェルです。
  • コマンドとユーティリティ-日々のアクティビティで利用できるさまざまなコマンドとユーティリティがあります。 cpmvcatgrep など コマンドとユーティリティのいくつかの例です。 250を超える標準コマンドに加えて、サードパーティソフトウェアを介して提供される多数のコマンドがあります。 すべてのコマンドには、さまざまなオプションが付属しています。
  • ファイルとディレクトリ-Unixのすべてのデータはファイルに整理されています。 すべてのファイルはディレクトリに整理されます。 これらのディレクトリは、 filesystem と呼ばれるツリー状の構造にさらに編成されます。

システムの起動

Unixオペレーティングシステムがインストールされているコンピューターを使用している場合は、システムをオンにしてライブにするだけです。

システムの電源を入れるとすぐに起動し、最後にシステムにログインするよう求められます。これは、システムにログインして日常のアクティビティに使用するアクティビティです。

Unixへのログイン

あなたが最初にUnixシステムに接続すると、通常、次のようなプロンプトが表示されます-

login:

ログインします

  • ユーザーID(ユーザーID)とパスワードを用意してください。 これらがまだない場合は、システム管理者に連絡してください。
  • ログインプロンプトでユーザーIDを入力し、 ENTER を押します。 ユーザーIDは*大文字と小文字を区別します*ので、システム管理者が指示したとおりに正確に入力してください。
  • パスワードプロンプトでパスワードを入力し、 ENTER を押します。 パスワードも大文字と小文字が区別されます。
  • 正しいユーザーIDとパスワードを入力すると、システムに入ることが許可されます。 画面に表示される情報とメッセージを読みます。次のとおりです。
login : amrood
amrood's password:
Last login: Sun Jun 14 09:32:32 2009 from 62.61.164.73
$

すべてのコマンドを入力するコマンドプロンプト( $ プロンプトと呼ばれることもあります)が表示されます。 たとえば、カレンダーを確認するには、次のように cal コマンドを入力する必要があります-

$ cal
     June 2009
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

$

パスワードを変更する

すべてのUnixシステムでは、ファイルやデータが自分のものであり、システム自体がハッカーやクラッカーから安全であることを保証するためにパスワードが必要です。 パスワードを変更する手順は次のとおりです-

  • ステップ1 *-開始するには、以下に示すようにコマンドプロンプトでパスワードを入力します。
  • ステップ2 *-現在使用している古いパスワードを入力します。
  • ステップ3 *-新しいパスワードを入力します。 誰も推測できないように、パスワードは常に十分に複雑にしてください。 ただし、覚えておいてください。
  • ステップ4 *-パスワードをもう一度入力して確認する必要があります。
$ passwd
Changing password for amrood
(current) Unix password:******
New UNIX password:*******
Retype new UNIX password:*******
passwd: all authentication tokens updated  successfully

$

-システムで現在および新しいパスワードを入力する必要がある場所を示すために、ここにアスタリスク(*)を追加しました。 入力しても文字は表示されません。

ディレクトリとファイルのリスト

Unixのすべてのデータはファイルに編成されます。 すべてのファイルはディレクトリに編成されます。 これらのディレクトリは、ファイルシステムと呼ばれるツリー状の構造に編成されています。

*ls* コマンドを使用して、ディレクトリで使用可能なすべてのファイルまたはディレクトリを一覧表示できます。 以下は、*-l *オプションを指定した *ls* コマンドの使用例です。
$ ls -l
total 19621
drwxrwxr-x  2 amrood amrood      4096 Dec 25 09:59 uml
-rw-rw-r--  1 amrood amrood      5341 Dec 25 08:38 uml.jpg
drwxr-xr-x  2 amrood amrood      4096 Feb 15  2006 univ
drwxr-xr-x  2 root   root        4096 Dec  9  2007 urlspedia
-rw-r--r--  1 root   root      276480 Dec  9  2007 urlspedia.tar
drwxr-xr-x  8 root   root        4096 Nov 25  2007 usr
-rwxr-xr-x  1 root   root        3192 Nov 25  2007 webthumb.php
-rw-rw-r--  1 amrood amrood     20480 Nov 25  2007 webthumb.tar
-rw-rw-r--  1 amrood amrood      5654 Aug  9  2007 yourfile.mid
-rw-rw-r--  1 amrood amrood    166255 Aug  9  2007 yourfile.swf

$

ここで、 d …​.. で始まるエントリはディレクトリを表します。 たとえば、uml、univ、urlspediaはディレクトリであり、残りのエントリはファイルです。

あなたは誰?

あなたがシステムにログインしている間、あなたは知って喜んでいるかもしれません:*私は誰ですか?

「あなたが誰であるか」を見つける最も簡単な方法は、 whoami コマンドを入力することです-

$ whoami
 amrood

$

システムで試してください。 このコマンドは、現在のログインに関連付けられているアカウント名をリストします。 who am i コマンドを試して、自分に関する情報を取得することもできます。

ログインしているのは誰ですか?

誰かが同時にコンピューターにログインしていることを知りたい場合があります。

他のユーザーについて知りたい程度に基づいて、この情報を取得するために使用できる3つのコマンドがあります: userswho 、および w

$ users
 amrood bablu qadir

$ who
amrood ttyp0 Oct 8 14:10 (limbo)
bablu  ttyp2 Oct 4 09:08 (calliope)
qadir  ttyp4 Oct 8 12:09 (dent)

$

システムで w コマンドを実行して、出力を確認してください。 これは、システムにログインしているユーザーに関連する情報を一覧表示します。

ログアウト

セッションを終了したら、システムからログアウトする必要があります。 これは、誰もあなたのファイルにアクセスしないようにするためです。

ログアウトするには

  • コマンドプロンプトで logout コマンドを入力するだけで、システムはすべてをクリーンアップし、接続を切断します。

システムのシャットダウン

コマンドラインを介してUnixシステムを適切にシャットダウンする最も一貫した方法は、次のコマンドのいずれかを使用することです-

Sr.No. Command & Description
1

halt

システムをすぐに停止します

2

init 0

事前定義されたスクリプトを使用してシステムの電源をオフにし、シャットダウンする前にシステムを同期およびクリーンアップします

3

init 6

システムを完全にシャットダウンしてから再起動して、システムを再起動します

4

poweroff

電源をオフにしてシステムをシャットダウンします

5

reboot

システムを再起動します

6

shutdown

システムをシャットダウンします

通常、システムをシャットダウンするには、スーパーユーザーまたはルート(Unixシステムで最も特権のあるアカウント)である必要があります。 ただし、一部のスタンドアロンまたは個人所有のUnixボックスでは、管理ユーザーと場合によっては通常のユーザーがそうすることができます。

Unix-ファイル管理

この章では、Unixでのファイル管理について詳しく説明します。 Unixのすべてのデータはファイルに編成されます。 すべてのファイルはディレクトリに編成されます。 これらのディレクトリは、ファイルシステムと呼ばれるツリー状の構造に編成されています。

何らかの方法でUnixを使用する場合、ほとんどの時間をファイルの処理に費やします。 このチュートリアルは、ファイルの作成と削除、コピーと名前の変更、ファイルへのリンクの作成などを理解するのに役立ちます。

Unixでは、ファイルの3つの基本的なタイプがあります-

  • 通常のファイル-通常のファイルは、データ、テキスト、またはプログラムの命令を含むシステム上のファイルです。 このチュートリアルでは、通常のファイルの操作について説明します。
  • ディレクトリ-ディレクトリには、特別なファイルと通常のファイルの両方が保存されます。 WindowsまたはMac OSに精通しているユーザーにとって、Unixディレクトリはフォルダーと同等です。
  • 特殊ファイル-一部の特殊ファイルは、ハードドライブ、CD-ROMドライブ、モデム、イーサネットアダプターなどのハードウェアへのアクセスを提供します。 他の特殊ファイルはエイリアスまたはショートカットに似ており、異なる名前を使用して単一のファイルにアクセスできます。

リストファイル

現在のディレクトリに格納されているファイルとディレクトリを一覧表示するには、次のコマンドを使用します-

$ls

上記のコマンドの出力例は次のとおりです-

$ls

bin        hosts  lib     res.03
ch07       hw1    pub     test_results
ch07.bak   hw2    res.01  users
docs       hw3    res.02  work

コマンド ls は、リストされたファイルに関する詳細情報を取得するのに役立つ -l オプションをサポートします-

$ls -l
total 1962188

drwxrwxr-x  2 amrood amrood      4096 Dec 25 09:59 uml
-rw-rw-r--  1 amrood amrood      5341 Dec 25 08:38 uml.jpg
drwxr-xr-x  2 amrood amrood      4096 Feb 15  2006 univ
drwxr-xr-x  2 root   root        4096 Dec  9  2007 urlspedia
-rw-r--r--  1 root   root      276480 Dec  9  2007 urlspedia.tar
drwxr-xr-x  8 root   root        4096 Nov 25  2007 usr
drwxr-xr-x  2    200    300      4096 Nov 25  2007 webthumb-1.01
-rwxr-xr-x  1 root   root        3192 Nov 25  2007 webthumb.php
-rw-rw-r--  1 amrood amrood     20480 Nov 25  2007 webthumb.tar
-rw-rw-r--  1 amrood amrood      5654 Aug  9  2007 yourfile.mid
-rw-rw-r--  1 amrood amrood    166255 Aug  9  2007 yourfile.swf
drwxr-xr-x 11 amrood amrood      4096 May 29  2007 zlib-1.2.3
$

ここにリストされているすべての列に関する情報があります-

  • 最初の列-ファイルタイプとファイルに与えられた許可を表します。 以下は、すべての種類のファイルの説明です。

  • * 2番目の列*-ファイルまたはディレクトリが使用するメモリブロックの数を表します。

  • 第3列-ファイルの所有者を表します。 これは、このファイルを作成したUnixユーザーです。

  • 第4列-所有者のグループを表します。 すべてのUnixユーザーには、関連するグループがあります。

  • 第5列-バイト単位でファイルサイズを表します。

  • 第6列-このファイルが最後に作成または変更された日付と時刻を表します。

  • 第7列-ファイルまたはディレクトリ名を表します。

    *ls -l* リストの例では、すべてのファイル行は *d* 、*-*、または *l* で始まります。 これらの文字は、リストされているファイルのタイプを示します。
Sr.No. Prefix & Description
1

-

ASCIIテキストファイル、バイナリ実行可能ファイル、ハードリンクなどの通常のファイル。

2

b

特殊ファイルをブロックします。 物理ハードドライブなどの入力/出力デバイスファイルをブロックします。

3

c

文字特殊ファイル。 物理ハードドライブなどの未加工の入出力デバイスファイル。

4

d

他のファイルとディレクトリのリストを含むディレクトリファイル。

5

l

シンボリックリンクファイル。 通常のファイルへのリンク。

6

p

名前付きパイプ。 プロセス間通信のメカニズム。

7

s

プロセス間通信に使用されるソケット。

メタキャラクター

Unixでは、メタキャラクターは特別な意味を持ちます。 たとえば、'および'はメタキャラクターです。*を使用して0個以上の文字に一致し、疑問符(?*)は単一の文字に一致します。

例-

$ls ch*.doc

すべてのファイルを表示します。名前は ch で始まり、*。doc *で終わります-

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc ch02-1.doc c

ここで、**は、任意の文字と一致するメタ文字として機能します。 あなただけの *.doc で終わるすべてのファイルを表示したい場合は、次のコマンドを使用することができます-

$ls *.doc

隠しファイル

不可視ファイルとは、最初の文字がドットまたはピリオド文字(。)であるファイルです。 Unixプログラム(シェルを含む)は、これらのファイルのほとんどを使用して構成情報を保存します。

隠しファイルのいくつかの一般的な例には、ファイルが含まれます-

  • .profile -Bourneシェル(sh)初期化スクリプト
  • .kshrc -Kornシェル(ksh)初期化スクリプト
  • .cshrc -Cシェル(csh)初期化スクリプト
  • .rhosts -リモートシェル構成ファイル

不可視のファイルをリストするには、 ls-a オプションを指定します-

$ ls -a

.         .profile       docs     lib     test_results
..        .rhosts        hosts    pub     users
.emacs    bin            hw1      res.01  work
.exrc     ch07           hw2      res.02
.kshrc    ch07.bak       hw3      res.03
$
  • 単一ドット(。)-これは現在のディレクトリを表します。
  • 二重ドット(..)-これは親ディレクトリを表します。

ファイルを作成する

*vi* エディターを使用して、任意のUnixシステムで通常のファイルを作成できます。 あなたは単に次のコマンドを与える必要があります-
$ vi filename

上記のコマンドは、指定されたファイル名でファイルを開きます。 ここで、キー i を押して編集モードに入ります。 編集モードになったら、次のプログラムのようにファイルにコンテンツを書き始めることができます-

This is unix file....I created it for the first time.....
I'm going to save this content in this file.

あなたがプログラムで完了したら、これらの手順に従ってください-

  • キー esc を押して、編集モードを終了します。
  • 2つのキーを押します Shift+ ZZ が一緒になって、ファイルから完全に出てきます。

これで、現在のディレクトリに filename で作成されたファイルが作成されます。

$ vi filename
$

ファイルを編集する

*vi* エディターを使用して、既存のファイルを編集できます。 私たちは、既存のファイルを開く方法を簡単に説明します-
$ vi filename

ファイルを開いたら、キー i を押すと編集モードになり、ファイルを編集して続行できます。 ファイル内をあちこち移動したい場合は、まずキー Esc を押して編集モードを終了する必要があります。 この後、次のキーを使用してファイル内を移動できます-

  • l キーで右側に移動します。
  • h キーで左側に移動します。
  • ファイル内で上下に移動する k キー。
  • ファイル内で下に移動する j キー。

したがって、上記のキーを使用して、編集したい場所にカーソルを置くことができます。 配置したら、 i キーを使用して編集モードにできます。 ファイルの編集が完了したら、 Esc を押し、最後に2つのキー Shift+を押します。 ZZ が一緒になって、ファイルから完全に出てきます。

ファイルのコンテンツを表示する

*cat* コマンドを使用して、ファイルの内容を表示できます。 以下は、上記で作成されたファイルの内容を表示する簡単な例です-
$ cat filename
This is unix file....I created it for the first time.....
I'm going to save this content in this file.
$

あなたは次のように*猫*コマンドと一緒に -b オプションを使用して行番号を表示することができます-

$ cat -b filename
1   This is unix file....I created it for the first time.....
2   I'm going to save this content in this file.
$

ファイル内の単語を数える

*wc* コマンドを使用して、ファイルに含まれる行、単語、および文字の合計数を取得できます。 以下は、上記で作成されたファイルに関する情報を表示する簡単な例です-
$ wc filename
2  19 103 filename
$

ここに4つの列すべての詳細があります-

  • 最初の列-ファイル内の行の総数を表します。
  • 第2列-ファイル内の単語の総数を表します。
  • 第3列-ファイル内の合計バイト数を表します。 これはファイルの実際のサイズです。
  • 第4列-ファイル名を表します。

複数のファイルを指定して、それらのファイルに関する情報を一度に取得できます。 以下は簡単な構文です-

$ wc filename1 filename2 filename3

ファイルをコピーする

ファイルのコピーを作成するには、 cp コマンドを使用します。 コマンドの基本的な構文は次のとおりです-

$ cp source_file destination_file

以下は、既存のファイル filename のコピーを作成する例です。

$ cp filename copyfile
$

これで、現在のディレクトリにもう1つの copyfile ファイルが見つかります。 このファイルは、元のファイル filename とまったく同じです。

ファイル名を変更する

ファイルの名前を変更するには、 mv コマンドを使用します。 以下は、基本的な構文です-

$ mv old_file new_file

次のプログラムは、既存のファイル filename の名前を newfile に変更します。

$ mv filename newfile
$
*mv* コマンドは、既存のファイルを新しいファイルに完全に移動します。 この場合、現在のディレクトリには *newfile* のみが見つかります。

ファイルを削除する

既存のファイルを削除するには、 rm コマンドを使用します。 以下は、基本的な構文です-

$ rm filename

注意-ファイルには有用な情報が含まれている場合があります。 この Delete コマンドを使用するときは、常に注意することをお勧めします。 rm コマンドとともに -i オプションを使用することをお勧めします。

以下は、既存のファイル filename を完全に削除する方法を示す例です。

$ rm filename
$

次のコマンドを使用すると、一度に複数のファイルを削除できます-

$ rm filename1 filename2 filename3
$

標準Unixストリーム

通常の状況では、すべてのUnixプログラムは起動時に3つのストリーム(ファイル)を開いています-

  • stdin -これは「標準入力」と呼ばれ、関連するファイル記述子は0です。 これは、STDINとしても表されます。 Unixプログラムは、STDINからデフォルトの入力を読み取ります。
  • stdout -これは「標準出力」と呼ばれ、関連するファイル記述子は1です。 これは、STDOUTとしても表されます。 Unixプログラムは、STDOUTにデフォルト出力を書き込みます
  • stderr -これは_標準エラー_と呼ばれ、関連するファイル記述子は2です。 これは、STDERRとしても表されます。 Unixプログラムは、すべてのエラーメッセージをSTDERRに書き込みます。

Unix-ディレクトリ管理

この章では、Unixでのディレクトリ管理について詳しく説明します。

ディレクトリは、ファイル名と関連情報を保存するためのソロジョブのファイルです。 すべてのファイルは、通常、特殊、またはディレクトリに関係なく、ディレクトリに含まれています。

Unixは、ファイルとディレクトリを整理するために階層構造を使用します。 この構造は、多くの場合、ディレクトリツリーと呼ばれます。 ツリーには単一のルートノード、スラッシュ文字( / )があり、他のすべてのディレクトリはその下に含まれています。

ホームディレクトリ

最初にログインしたときに自分自身を見つけるディレクトリは、ホームディレクトリと呼ばれます。

ファイルを整理するために作成するホームディレクトリとサブディレクトリで多くの作業を行います。

次のコマンドを使用して、いつでもホームディレクトリに移動できます-

$cd ~
$

ここで、*〜*はホームディレクトリを示します。 あなたは他のユーザーのホームディレクトリに移動する必要があると仮定し、次のコマンドを使用します-

$cd ~username
$

最後のディレクトリに移動するには、次のコマンドを使用できます-

$cd -
$

絶対/相対パス名

ディレクトリは、最上部にルート(/)を持つ階層に配置されます。 階層内のファイルの位置は、パス名で記述されます。

パス名の要素は/で区切られます。 ルートに関連して記述されている場合、パス名は絶対パスであるため、絶対パス名は常に/で始まります。

絶対ファイル名の例を次に示します。

/etc/passwd
/users/sjones/chem/notes
/dev/rdsk/Os3

パス名は、現在の作業ディレクトリからの相対パスにすることもできます。 相対パス名が/で始まることはありません。 ユーザーamroodのホームディレクトリに関連して、いくつかのパス名は次のようになります-

chem/notes
personal/res

いつでもファイルシステム階層内のどこにいるかを判断するには、コマンド pwd を入力して現在の作業ディレクトリを印刷します-

$pwd
/user0/home/amrood

$

ディレクトリのリスト

ディレクトリ内のファイルを一覧表示するには、次の構文を使用できます-

$ls dirname

以下は、 /usr/local ディレクトリに含まれるすべてのファイルをリストする例です-

$ls/usr/local

X11       bin          gimp       jikes       sbin
ace       doc          include    lib         share
atalk     etc          info       man         ami

ディレクトリの作成

これで、ディレクトリの作成方法を理解できます。 ディレクトリは、次のコマンドによって作成されます-

$mkdir dirname

ここで、directoryは作成するディレクトリの絶対パス名または相対パス名です。 たとえば、コマンド-

$mkdir mydir
$

現在のディレクトリに mydir ディレクトリを作成します。 ここに別の例があります-

$mkdir/tmp/test-dir
$

このコマンドは、 /tmp ディレクトリに test-dir ディレクトリを作成します。 mkdir コマンドは、要求されたディレクトリを正常に作成した場合、出力を生成しません。

コマンドラインで複数のディレクトリを指定すると、 mkdir は各ディレクトリを作成します。 たとえば、

$mkdir docs pub
$

現在のディレクトリの下にディレクトリdocsおよびpubを作成します。

親ディレクトリの作成

これで、親ディレクトリの作成方法を理解できます。 ディレクトリを作成するときに、その親ディレクトリが存在しない場合があります。 この場合、 mkdir は次のようなエラーメッセージを発行します-

$mkdir/tmp/amrood/test
mkdir: Failed to make directory "/tmp/amrood/test";
No such file or directory
$

このような場合、 mkdir コマンドに -p オプションを指定できます。 必要なすべてのディレクトリが作成されます。 たとえば-

$mkdir -p/tmp/amrood/test
$

上記のコマンドは、必要なすべての親ディレクトリを作成します。

ディレクトリの削除

ディレクトリは、次のように rmdir コマンドを使用して削除できます-

$rmdir dirname
$

注意-ディレクトリを削除するには、それが空であることを確認してください。これは、このディレクトリ内にファイルまたはサブディレクトリが存在しないことを意味します。

次のように、一度に複数のディレクトリを削除できます-

$rmdir dirname1 dirname2 dirname3
$

上記のコマンドは、ディレクトリdirname1、dirname2、およびdirname3が空の場合、それらを削除します。 rmdir コマンドは、成功すると出力を生成しません。

ディレクトリの変更

*cd* コマンドを使用して、ホームディレクトリに変更するだけではありません。 有効な絶対パスまたは相対パスを指定して、任意のディレクトリに変更するために使用できます。 構文は以下のとおりです-
$cd dirname
$

ここで、 dirname は、変更するディレクトリの名前です。 たとえば、コマンド-

$cd/usr/local/bin
$

ディレクトリ /usr/local/bin への変更。 このディレクトリから、次の相対パスを使用してディレクトリ /usr/home/amroodcd できます-

$cd ../../home/amrood
$

ディレクトリの名前変更

  • mv(移動)*コマンドを使用して、ディレクトリの名前を変更することもできます。 構文は次のとおりです-
$mv olddir newdir
$

次のように、ディレクトリの名前を mydir から yourdir に変更できます-

$mv mydir yourdir
$

ディレクトリ。 (ドット)および.. (ドットドット)

  • filename。(ドット)は現在の作業ディレクトリを表します。 *filename .. (ドットドット)は、現在の作業ディレクトリの1レベル上のディレクトリを表し、多くの場合親ディレクトリと呼ばれます。

現在の作業ディレクトリ/ファイルのリストを表示するコマンドを入力し、-aオプション*を使用してすべてのファイルをリストし、-lオプション*を使用して長いリストを提供すると、次の結果が返されます。

$ls -la
drwxrwxr-x    4    teacher   class   2048  Jul 16 17.56 .
drwxr-xr-x    60   root              1536  Jul 13 14:18 ..
----------    1    teacher   class   4210  May 1 08:27 .profile
-rwxr-xr-x    1    teacher   class   1948  May 12 13:42 memo
$

Unix-ファイル許可/アクセスモード

この章では、Unixのファイル許可とアクセスモードについて詳しく説明します。 ファイルの所有権は、ファイルを保存するための安全な方法を提供するUnixの重要なコンポーネントです。 Unixのすべてのファイルには、次の属性があります-

  • 所有者の許可-所有者の許可は、ファイルの所有者がファイルに対して実行できるアクションを決定します。
  • グループ権限-グループの権限は、ファイルが属するグループのメンバーであるユーザーがファイルに対して実行できるアクションを決定します。
  • その他(世界)の許可-他のユーザーの許可は、他のすべてのユーザーがファイルに対して実行できるアクションを示します。

許可インジケーター

*ls -l* コマンドを使用している間、次のようにファイル許可に関連するさまざまな情報が表示されます-
$ls -l/home/amrood
-rwxr-xr--  1 amrood   users 1024  Nov 2 00:10  myfile
drwxr-xr--- 1 amrood   users 1024  Nov 2 00:10  mydir

ここで、最初の列はさまざまなアクセスモード、つまりファイルまたはディレクトリに関連付けられたアクセス許可を表します。

アクセス許可は3つのグループに分割され、グループ内の各位置は、読み取り(r)、書き込み(w)、実行(x)の順に特定のアクセス許可を示します-

  • 最初の3文字(2〜4)は、ファイルの所有者の許可を表します。 たとえば、*-rwxr-xr-*は、所有者が読み取り(r)、書き込み(w)、および実行(x)許可を持っていることを表します。
  • 3文字(5〜7)の2番目のグループは、ファイルが属するグループのアクセス許可で構成されます。 たとえば、*-rwxr-xr-*は、グループに読み取り(r)および実行(x)権限があり、書き込み権限はないことを表します。
  • 3文字の最後のグループ(8〜10)は、他のすべてのユーザーのアクセス許可を表します。 たとえば、-rwxr-xr-*は、 read(r)*のみの許可があることを表します。

ファイルアクセスモード

ファイルのアクセス許可は、Unixシステムのセキュリティにおける最初の防衛線です。 Unixパーミッションの基本的な構成要素は、以下で説明されている readwrite 、および execute パーミッションです-

Read

ファイルの内容を読み取る、つまり表示する機能を付与します。

書きます

ファイルのコンテンツを変更または削除する機能を付与します。

実行する

実行権限を持つユーザーは、ファイルをプログラムとして実行できます。

ディレクトリアクセスモード

ディレクトリアクセスモードは、他のファイルと同じ方法でリストおよび編成されます。 言及する必要があるいくつかの違いがあります-

Read

ディレクトリへのアクセスは、ユーザーがコンテンツを読むことができることを意味します。 ユーザーは、ディレクトリ内の filenames を見ることができます。

書きます

アクセスとは、ユーザーがディレクトリにファイルを追加または削除できることを意味します。

実行する

ディレクトリの実行は実際には意味がないので、これをトラバース許可と考えてください。

*ls* または *cd* コマンドを実行するには、ユーザーは *bin* ディレクトリへの *execute* アクセス権を持っている必要があります。

権限を変更する

ファイルまたはディレクトリのアクセス許可を変更するには、 chmod (モード変更)コマンドを使用します。 chmodを使用するには、シンボリックモードと絶対モードの2つの方法があります。

シンボリックモードでのchmodの使用

初心者がファイルまたはディレクトリのアクセス許可を変更する最も簡単な方法は、シンボリックモードを使用することです。 シンボリック許可を使用すると、次の表の演算子を使用して、必要な許可セットを追加、削除、または指定できます。

Sr.No. Chmod operator & Description
1

+

指定された許可をファイルまたはディレクトリに追加します。

2

-

ファイルまたはディレクトリから指定された許可を削除します。

3

=

指定された許可を設定します。

*testfile* を使用した例を次に示します。 テストファイルで *ls -1* を実行すると、ファイルの権限が次のようになることが示されます-
$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

次に、前の表の各例の chmod コマンドがテストファイルで実行され、その後に ls –l が続くため、アクセス許可の変更を確認できます-

$chmod o+wx testfile
$ls -l testfile
-rwxrwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod u-x testfile
$ls -l testfile
-rw-rwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod g = rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

これらのコマンドを1行で組み合わせる方法は次のとおりです-

$chmod o+wx,u-x,g = rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

絶対アクセス許可でのchmodの使用

chmodコマンドで許可を変更する2番目の方法は、番号を使用してファイルの許可の各セットを指定することです。

次の表に示すように、各権限には値が割り当てられ、権限の各セットの合計はそのセットの番号を提供します。

Number Octal Permission Representation Ref
0 No permission ---
1 Execute permission --x
2 Write permission -w-
3 Execute and write permission: 1 (execute) + 2 (write) = 3 -wx
4 Read permission r--
5 Read and execute permission: 4 (read) PLUS 1 (execute) = 5 r-x
6 Read and write permission: 4 (read) PLUS 2 (write) = 6 rw-
7 All permissions: 4 (read) PLUS 2 (write) PLUS 1 (execute) = 7 rwx

テストファイルを使用した例を次に示します。 テストファイルで ls -1 を実行すると、ファイルの権限が次のようになることが示されます-

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

次に、前の表の各例の chmod コマンドがテストファイルで実行され、その後に ls –l が続くため、アクセス許可の変更を確認できます-

$ chmod 755 testfile
$ls -l testfile
-rwxr-xr-x  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 743 testfile
$ls -l testfile
-rwxr---wx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 043 testfile
$ls -l testfile
----r---wx  1 amrood   users 1024  Nov 2 00:10  testfile

所有者とグループの変更

Unixでアカウントを作成する際、各ユーザーに*所有者ID *および*グループID *を割り当てます。 上記のすべての権限も、所有者とグループに基づいて割り当てられます。

所有者とファイルのグループを変更するための2つのコマンドが利用可能です-

  • chown - chown コマンドは "change owner" を表し、ファイルの所有者を変更するために使用されます。
  • chgrp - chgrp コマンドは "グループの変更" を表し、ファイルのグループを変更するために使用されます。

所有権の変更

*chown* コマンドは、ファイルの所有権を変更します。 基本的な構文は次のとおりです-
$ chown user filelist

ユーザーの値は、システム上の*ユーザーの名前*またはシステム上のユーザーの*ユーザーID(uid)*のいずれかです。

次の例は、概念を理解するのに役立ちます-

$ chown amrood testfile
$

指定されたファイルの所有者をユーザー amrood に変更します。

-スーパーユーザーrootには、ファイルの所有権を変更する無制限の機能がありますが、通常のユーザーは所有するファイルのみの所有権を変更できます。

グループ所有権の変更

*chgrp* コマンドは、ファイルのグループ所有権を変更します。 基本的な構文は次のとおりです-
$ chgrp group filelist

groupの値は、システム上の*グループの名前*またはシステム上の*グループID(GID)*のいずれかです。

次の例では、概念を理解するのに役立ちます-

$ chgrp special testfile
$

指定されたファイルのグループを special グループに変更します。

SUIDおよびSGIDファイルの許可

多くの場合、コマンドを実行するときは、タスクを実行するために特別な特権で実行する必要があります。

たとえば、 passwd コマンドでパスワードを変更すると、新しいパスワードは /etc/shadow ファイルに保存されます。

通常のユーザーとして、セキュリティ上の理由からこのファイルへの*読み取り*または*書き込み*アクセス権はありませんが、パスワードを変更する場合は、このファイルへの書き込み権限が必要です。 これは、 passwd プログラムがファイル /etc/shadow に書き込むために追加の許可を与える必要があることを意味します。

  • Set User ID(SUID)および Set Group ID(SGID)*ビットと呼ばれるメカニズムを介して、プログラムに追加の許可が与えられます。

SUIDビットが有効になっているプログラムを実行すると、そのプログラムの所有者の権限が継承されます。 SUIDビットが設定されていないプログラムは、プログラムを開始したユーザーの権限で実行されます。

SGIDの場合も同様です。 通常、プログラムはユーザーのグループ権限で実行されますが、代わりにこのプログラムのグループはプログラムのグループ所有者に変更されます。

許可が使用可能な場合、SUIDおよびSGIDビットは文字「」で表示されます。 SUID *"s" ビットは、所有者の execute パーミッションが通常存在するパーミッションビットに配置されます。

たとえば、コマンド-

$ ls -l/usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47 /usr/bin/passwd*
$

SUIDビットが設定され、コマンドがルートによって所有されていることを示します。 小文字の s ではなく、実行位置の大文字の S は、実行ビットが設定されていないことを示します。

ディレクトリでスティッキービットが有効になっている場合、次のいずれかのユーザーである場合にのみファイルを削除できます-

  • スティッキディレクトリの所有者
  • 削除されるファイルの所有者
  • スーパーユーザー、root

ディレクトリのSUIDおよびSGIDビットを設定するには、次のコマンドを試してください-

$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root  4096 Jun 19 06:45 dirname
$

Unix-環境

この章では、Unix環境について詳しく説明します。 Unixの重要な概念は、環境変数によって定義される environment です。 システムによって設定されるものもあれば、ユーザーによって設定されるものもあれば、シェルまたは別のプログラムをロードするプログラムによって設定されるものもあります。

変数は、値を割り当てる文字列です。 割り当てられる値は、数値、テキスト、ファイル名、デバイス、またはその他の種類のデータです。

たとえば、最初に変数TESTを設定し、次に echo コマンドを使用してその値にアクセスします-

$TEST="Unix Programming"
$echo $TEST

次の結果が生成されます。

Unix Programming

環境変数は $ 記号を使用せずに設定されますが、それらにアクセスするときは接頭辞として$記号を使用します。 これらの変数は、シェルから出るまで値を保持します。

システムにログインすると、シェルは環境をセットアップするために*初期化*と呼ばれるフェーズを経ます。 これは通常、次のファイルを読み取るシェルを含む2段階のプロセスです-

  • /etc/profile * プロフィール

プロセスは次のとおりです-

  • シェルは、ファイル /etc/profile が存在するかどうかを確認します。
  • 存在する場合、シェルはそれを読み取ります。 それ以外の場合、このファイルはスキップされます。 エラーメッセージは表示されません。
  • シェルは、*。profile *ファイルがホームディレクトリに存在するかどうかを確認します。 ホームディレクトリは、ログイン後に開始するディレクトリです。
  • 存在する場合、シェルはそれを読み取ります。それ以外の場合、シェルはそれをスキップします。 エラーメッセージは表示されません。

これらのファイルの両方が読み取られるとすぐに、シェルはプロンプトを表示します-

$

これは、コマンドを実行して実行させるためのプロンプトです。

注意-ここで詳述するシェル初期化プロセスはすべての Bourne タイプのシェルに適用されますが、 bash および ksh で使用される追加ファイルがいくつかあります。

.profileファイル

ファイル /etc/profile は、Unixマシンのシステム管理者によって管理され、システム上のすべてのユーザーが必要とするシェル初期化情報が含まれています。

ファイル .profile は管理下にあります。 このファイルには、必要なだけのシェルカスタマイズ情報を追加できます。 あなたが構成する必要がある情報の最小セットは含まれています-

  • 使用している端末のタイプ。
  • コマンドを見つけるディレクトリのリスト。
  • 端末のルックアンドフィールに影響する変数のリスト。

ホームディレクトリで使用可能な .profile を確認できます。 viエディターを使用して開き、環境に設定されているすべての変数を確認します。

端末タイプの設定

通常、使用している端末のタイプは、 login または getty プログラムによって自動的に構成されます。 場合によっては、自動構成プロセスが端末を誤って推測します。

端末が正しく設定されていない場合、コマンドの出力が奇妙に見えるか、シェルと適切に対話できない可能性があります。

これが事実ではないことを確認するために、ほとんどのユーザーは、次の方法で端末を最低公分母に設定します-

$TERM=vt100
$

PATHを設定する

コマンドプロンプトでコマンドを入力すると、シェルは実行する前にコマンドを見つける必要があります。

PATH変数は、シェルがコマンドを探す場所を指定します。 通常、パス変数は次のように設定されます-

$PATH=/bin:/usr/bin
$

ここで、コロン文字*(:)*で区切られた個々のエントリはそれぞれディレクトリです。 あなたがコマンドを実行するためにシェルを要求し、それがPATH変数で指定されたディレクトリのいずれかでそれを見つけることができない場合、次のようなメッセージが表示されます-

$hello
hello: not found
$

次のセクションで説明するPS1やPS2などの変数があります。

PS1およびPS2変数

コマンドプロンプトとしてシェルが表示する文字は、変数PS1に保存されます。 この変数は、必要なものに変更できます。 変更するとすぐに、その時点からシェルによって使用されます。

たとえば、コマンドを発行した場合-

$PS1='=>'
=>
=>
=>

プロンプトは⇒になります。 作業ディレクトリを表示するように PS1 の値を設定するには、コマンドを発行します-

=>PS1="[\u@\h \w]\$"
[root@ip-72-167-112-17/var/www/finddevguides/unix]$
[root@ip-72-167-112-17/var/www/finddevguides/unix]$

このコマンドの結果、プロンプトにはユーザーのユーザー名、マシンの名前(ホスト名)、および作業ディレクトリが表示されます。

PS1の値の引数として使用できる*エスケープシーケンス*がかなりあります。プロンプトが情報であなたを圧倒しないように、最も重要なものに自分自身を制限するようにしてください。

Sr.No. Escape Sequence & Description
1

\t

HH:MM:SSとして表される現在の時刻

2

\d

現在の日付、平日の月の日付として表されます

3

\n

改行

4

\s

現在のシェル環境

5

\W

作業ディレクトリ

6

\w

作業ディレクトリの完全パス

7

\u

現在のユーザーのユーザー名

8

\h

現在のマシンのホスト名

9

\#

現在のコマンドのコマンド番号。 新しいコマンドが入力されると増加します

10

\$

有効UIDが0の場合(つまり、rootとしてログインしている場合)、#文字でプロンプトを終了します。それ以外の場合は、$記号を使用します

ログインするたびに自分で変更することも、*。profile *ファイルに追加することでPS1で自動的に変更することもできます。

不完全なコマンドを発行すると、シェルは2番目のプロンプトを表示し、コマンドが完了するのを待って、もう一度 Enter を押します。

デフォルトのセカンダリプロンプトは*> (大なり記号)ですが、 *PS2 シェル変数を再定義することで変更できます-

以下は、デフォルトのセカンダリプロンプトを使用する例です-

$ echo "this is a
> test"
this is a
test
$

以下に示す例は、カスタマイズされたプロンプトでPS2を再定義します-

$ PS2="secondary prompt->"
$ echo "this is a
secondary prompt->test"
this is a
test
$

環境変数

以下は、重要な環境変数の部分的なリストです。 これらの変数は、次のように設定およびアクセスされます-

Sr.No. Variable & Description
1

DISPLAY

  • X11* プログラムがデフォルトで使用するディスプレイの識別子が含まれています。
2

HOME

現在のユーザーのホームディレクトリを示します。cd built-in コマンドのデフォルト引数です。

3

IFS

展開後の単語分割にパーサーが使用する Internal Field Separator を示します。

4

LANG

LANGはデフォルトのシステムロケールに展開されます。 LC_ALLを使用してこれをオーバーライドできます。 たとえば、値が pt_BR の場合、言語は(ブラジル)ポルトガル語に設定され、ロケールはブラジルに設定されます。

5

LD_LIBRARY_PATH

動的リンカーを備えたUnixシステムには、他のディレクトリを検索する前に、execの後にプロセスイメージを構築するときに共有オブジェクトを検索する必要があるディレクトリのコロン区切りのリストが含まれています。

6

PATH

コマンドの検索パスを示します。 これは、シェルがコマンドを探すディレクトリのコロン区切りのリストです。

7

PWD

cdコマンドで設定された現在の作業ディレクトリを示します。

8

RANDOM

参照されるたびに、0〜32,767のランダムな整数を生成します。

9

SHLVL

bashのインスタンスが開始されるたびに1ずつ増加します。 この変数は、組み込みのexitコマンドが現在のセッションを終了するかどうかを判断するのに役立ちます。

10

TERM

表示タイプを指します。

11

TZ

タイムゾーンを指します。 GMT、ASTなどの値を取ることができます。

12

UID

現在のユーザーの数値ユーザーIDに展開され、シェルの起動時に初期化されます。

以下は、いくつかの環境変数を示すサンプル例です-

$ echo $HOME
/root
]$ echo $DISPLAY

$ echo $TERM
xterm
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/home/amrood/bin:/usr/local/bin
$

Unix基本ユーティリティ-印刷、メール

この章では、Unixの基本ユーティリティとしての印刷と電子メールについて詳しく説明します。 これまでのところ、Unix OSとその基本的なコマンドの性質を理解しようとしました。 この章では、日常生活で使用できるいくつかの重要なUnixユーティリティを学習します。

ファイルを印刷する

Unixシステムでファイルを印刷する前に、余白を調整したり、一部の単語を強調表示したりするために、ファイルを再フォーマットすることができます。 ほとんどのファイルは再フォーマットせずに印刷することもできますが、生の印刷はそれほど魅力的ではない場合があります。

Unixの多くのバージョンには、 nrofftroff という2つの強力なテキストフォーマッタが含まれています。

prコマンド

*pr* コマンドは、端末画面またはプリンターのファイルのマイナーフォーマットを行います。 たとえば、ファイルに名前の長いリストがある場合、画面上で2つ以上の列にフォーマットできます。

以下は、 pr コマンドの構文です-

pr option(s) filename(s)
*pr* は、画面上または印刷されたコピー上でのみファイルの形式を変更します。元のファイルは変更されません。 次の表は、いくつかの *pr* オプションを示しています-
Sr.No. Option & Description
1

-k

出力の k 列を生成します

2

-d

出力をダブルスペースにします(すべての pr バージョンではありません)

3

-h "header"

次のアイテムをレポートヘッダーとして取得します

4

-t

ヘッダーおよび上下の余白の印刷を排除します

5

-l PAGE_LENGTH

ページの長さをPAGE_LENGTH(66)行に設定します。 デフォルトのテキスト行数は56です

6

-o MARGIN

各行をMARGIN(ゼロ)スペースでオフセットします

7

-w PAGE_WIDTH

複数のテキスト列出力のみのページ幅をPAGE_WIDTH(72)文字に設定します

*pr* を使用する前に、foodという名前のサンプルファイルの内容を以下に示します。
$cat food
Sweet Tooth
Bangkok Wok
Mandalay
Afghani Cuisine
Isle of Java
Big Apple Deli
Sushi and Sashimi
Tio Pepe's Peppers
........
$
*pr* コマンドを使用して、ヘッダー_Restaurants_を含む2列のレポートを作成しましょう-
$pr -2 -h "Restaurants" food
Nov  7  9:58 1997  Restaurants   Page 1

Sweet Tooth              Isle of Java
Bangkok Wok              Big Apple Deli
Mandalay                 Sushi and Sashimi
Afghani Cuisine          Tio Pepe's Peppers
........
$

lpおよびlprコマンド

コマンド lp または lpr は、画面表示ではなく、ファイルを紙に印刷します。 pr コマンドを使用してフォーマットの準備ができたら、これらのコマンドのいずれかを使用して、コンピューターに接続されているプリンターでファイルを印刷できます。

システム管理者がサイトでデフォルトのプリンタを設定している可能性があります。 デフォルトのプリンタで*食品*という名前のファイルを印刷するには、次の例のように、 lp または lpr コマンドを使用します-

$lp food
request id is laserp-525  (1 file)
$
*lp* コマンドは、印刷ジョブのキャンセルまたはステータスの確認に使用できるIDを表示します。
  • lp コマンドを使用している場合は、-n * Num オプションを使用して、Num個のコピーを印刷できます。 コマンド *lpr とともに、- Num を同じものに使用できます。 共有ネットワークに複数のプリンターが接続されている場合、-d printer オプションとlpコマンドを使用してプリンターを選択でき、同じ目的で-P * *printer *オプションとlprコマンドを使用できます。 ここで、printerはプリンター名です。

lpstatおよびlpqコマンド

*lpstat* コマンドは、プリンターキューの内容(要求ID、所有者、ファイルサイズ、印刷のためにジョブが送信された時期、および要求のステータス)を表示します。

自分以外の出力要求をすべて表示する場合は、 lpstat -o を使用します。 要求は、印刷される順序で表示されます-

$lpstat -o
laserp-573  john  128865  Nov 7  11:27  on laserp
laserp-574  grace  82744  Nov 7  11:28
laserp-575  john   23347  Nov 7  11:35
$
*lpq* は、 *lpstat -o* とは少し異なる情報を提供します-
$lpq
laserp is ready and printing
Rank   Owner      Job  Files                  Total Size
active john       573  report.ps              128865 bytes
1st    grace      574  ch03.ps ch04.ps        82744 bytes
2nd    john       575  standard input         23347 bytes
$

ここでは、最初の行にプリンターの状態が表示されます。 プリンターが無効になっている場合や用紙がなくなっている場合、この最初の行に異なるメッセージが表示される場合があります。

cancelおよびlprmコマンド

*cancel* コマンドは、* lpコマンド*からの印刷要求を終了します。 *lprm* コマンドは、すべての* lpr要求*を終了します。 要求のID(lpまたはlpqで表示)またはプリンターの名前を指定できます。
$cancel laserp-575
request "laserp-575" cancelled
$

そのIDに関係なく、現在印刷中のリクエストをキャンセルするには、単にキャンセルとプリンター名を入力します-

$cancel laserp
request "laserp-573" cancelled
$
*lprm* コマンドは、アクティブなジョブが自分のものであればキャンセルします。 それ以外の場合は、引数としてジョブ番号を指定するか、*ダッシュ(-)*を使用してすべてのジョブを削除できます-
$lprm 575
dfA575diamond dequeued
cfA575diamond dequeued
$
*lprm* コマンドは、プリンタキューから削除された実際のファイル名を示します。

メール送信

Unixメールコマンドを使用して、メールを送受信します。 これは、電子メールを送信するための構文です-

$mail [-s subject] [-c cc-addr] [-b bcc-addr] to-addr

メールコマンドに関連する重要なオプションを次に示します-s

Sr.No. Option & Description
1

-s

コマンドラインで件名を指定します。

2

-c

ユーザーのリストにカーボンコピーを送信します。 リストは、名前のコンマ区切りリストにする必要があります。

3

-b

リストにブラインドカーボンコピーを送信します。 リストは、名前のコンマ区切りリストにする必要があります。

以下は、テストメッセージを[email protected]に送信する例です。

$mail -s "Test Message" [email protected]

次に、メッセージを入力し、行の先頭に "control-D" を入力する必要があります。 停止するには、単に次のようにドット*(。)*を入力します-

Hi,

This is a test
.
Cc:

あなたは次のように*リダイレクト<演算子*を使用して完全なファイルを送信することができます-

$mail -s "Report 05/06/07" [email protected] < demo.txt

Unixシステムで受信メールを確認するには、次のようにメールを入力するだけです-

$mail
no email

Unix-パイプとフィルター

この章では、Unixのパイプとフィルターについて詳しく説明します。 1つのプログラムからの出力が次のプログラムの入力になるように、2つのコマンドを一緒に接続できます。 この方法で接続された2つ以上のコマンドはパイプを形成します。

パイプを作成するには、2つのコマンド間のコマンドラインに垂直バー(*&verbar; *)を配置します。

プログラムが別のプログラムから入力を受け取ると、その入力に対して何らかの操作を実行し、結果を標準出力に書き込みます。 filter と呼ばれます。

grepコマンド

grepコマンドは、特定のパターンを持つ行のファイルを検索します。 構文は-

$grep pattern file(s)
*"grep"* という名前は、ed(Unix行エディタ)コマンド *g/re/p* に由来します。これは、「正規表現をグローバルに検索し、それを含むすべての行を出力する」ことを意味します。

正規表現は、いくつかのプレーンテキスト(たとえば、単語)またはパターンマッチングに使用される特殊文字のいずれかです。

grepの最も簡単な使用法は、単一の単語で構成されるパターンを探すことです。 特定の文字列を含む入力ファイルの行のみが標準出力に送信されるように、パイプで使用できます。 grepに読み込むファイル名を指定しないと、標準入力が読み込まれます。それはすべてのフィルタープログラムが機能する方法です-

$ls -l | grep "Aug"
-rw-rw-rw-   1 john  doc     11008 Aug  6 14:10 ch02
-rw-rw-rw-   1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--   1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$
*grep* コマンドとともに使用できるさまざまなオプションがあります-
Sr.No. Option & Description
1

-v

パターンに一致しないすべての行を印刷します。

2

-n

一致した行とその行番号を出力します。

3

-l

一致する行(文字「l」)を持つファイルの名前のみを出力します

4

-c

一致する行の数のみを出力します。

5

-i

大文字または小文字に一致します。

ここで、正規表現を使用して、grepに "キャロル" が付いた行を見つけ、その後に正規表現では "。*"と略されるゼロまたは他の文字が続き、その後に "Aug"が続くようにします。

ここでは、大文字と小文字を区別しない検索を行うために - i オプションを使用しています-

$ls -l | grep -i "carol.*aug"
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

sortコマンド

*sort* コマンドは、テキストの行をアルファベット順または数値順に並べます。 次の例では、食品ファイル内の行をソートします-
$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java

Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe's Peppers
$
*sort* コマンドは、デフォルトでテキストの行をアルファベット順に並べます。 並べ替えを制御する多くのオプションがあります-
Sr.No. Description
1

-n

数値順にソートし(例:​​10は2の後にソートします)、空白とタブを無視します。

2

-r

ソート順を逆にします。

3

-f

大文字と小文字を一緒にソートします。

4

PLUSx

ソート時に最初の x フィールドを無視します。

3つ以上のコマンドをパイプにリンクできます。 grep を使用した以前のパイプの例を使用すると、8月に変更されたファイルをサイズの順序でさらにソートできます。

次のパイプは、コマンド lsgrep 、および sort で構成されています-

$ls -l | grep "Aug" | sort +4n
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-rw-  1 john  doc     11008 Aug  6 14:10 ch02
$

このパイプは、8月に変更されたディレクトリ内のすべてのファイルをサイズの順にソートし、端末画面に出力します。 並べ替えオプション&plus; 4nは、4つのフィールドをスキップし(フィールドは空白で区切られます)、行を数値順に並べ替えます。

pgおよびその他のコマンド

通常、長い出力は画面上で圧縮できますが、さらにテキストを実行したり、フィルターとして pg コマンドを使用したりすると、画面がテキストでいっぱいになると、表示が停止します。

長いディレクトリリストがあると仮定しましょう。 ソートされたリストを読みやすくするために、次のように出力を more にパイプします-

$ls -l | grep "Aug" | sort +4n | more
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--  1 john  doc     14827 Aug  9 12:40 ch03
    .
    .
    .
-rw-rw-rw-  1 john  doc     16867 Aug  6 15:56 ch05
--More--(74%)

画面がファイルサイズの順序でソートされた行で構成されるテキストでいっぱいになると、画面がいっぱいになります。 画面の下部にある more プロンプトでは、コマンドを入力して、ソートされたテキストを移動できます。

この画面での作業が完了したら、moreプログラムの説明にリストされているコマンドのいずれかを使用できます。

Unix-プロセス管理

この章では、Unixでのプロセス管理について詳しく説明します。 Unixシステムでプログラムを実行すると、システムはそのプログラム用の特別な環境を作成します。 この環境には、システム上で他のプログラムが実行されていないかのようにシステムがプログラムを実行するために必要なすべてが含まれています。

Unixでコマンドを発行するたびに、新しいプロセスが作成または開始されます。 ディレクトリの内容を一覧表示するために ls コマンドを試したとき、プロセスを開始しました。 プロセスは、簡単に言えば、実行中のプログラムのインスタンスです。

オペレーティングシステムは、 pid または process ID として知られる5桁のID番号でプロセスを追跡します。 システム内の各プロセスには一意の pid があります。

可能性のあるすべての数字が使い果たされ、次のpidがロールオーバーまたは最初からやり直されるため、最終的にPidが繰り返されます。 Unixは各プロセスを追跡するために使用するpidであるため、どの時点でも同じpidを持つ2つのプロセスはシステムに存在しません。

プロセスを開始する

あなたがプロセスを開始する(コマンドを実行する)とき、それを実行できる2つの方法があります-

  • 前景プロセス
  • バックグラウンドプロセス

前景プロセス

デフォルトでは、開始するすべてのプロセスはフォアグラウンドで実行されます。 キーボードから入力を取得し、画面に出力を送信します。

これは、 ls コマンドで確認できます。 あなたが現在のディレクトリ内のすべてのファイルを一覧表示する場合は、次のコマンドを使用することができます-

$ls ch*.doc

これにより、すべてのファイルが表示され、その名前は ch で始まり .doc で終わります-

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

プロセスはフォアグラウンドで実行され、出力は画面に送られます。 ls コマンドが入力を必要とする場合(必要ではありません)、キーボードからの入力を待機します。

プログラムがフォアグラウンドで実行されていて時間がかかる場合、プログラムが処理を終了して表示されるまでプロンプトが利用できないため、他のコマンドを実行(他のプロセスを開始)することはできません。

バックグラウンドプロセス

バックグラウンドプロセスは、キーボードに接続せずに実行されます。 バックグラウンドプロセスでキーボード入力が必要な場合、待機します。

バックグラウンドでプロセスを実行する利点は、他のコマンドを実行できることです。別の開始を完了するまで待つ必要はありません!

バックグラウンドプロセスを開始する最も簡単な方法は、コマンドの最後にアンパサンド()を追加することです。

$ls ch*.doc &

これは、名前が ch で始まり .doc で終わるすべてのファイルを表示します-

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

ここで、 ls コマンドが入力を必要とする場合(入力しない場合)、フォアグラウンドに移動してキーボードからデータを提供するまで停止状態になります。

その最初の行には、バックグラウンドプロセスに関する情報(ジョブ番号とプロセスID)が含まれています。 バックグラウンドとフォアグラウンドの間でジョブ番号を操作するには、ジョブ番号を知る必要があります。

Enterキーを押すと、次が表示されます-

[1]   +   Done                 ls ch*.doc &
$

最初の行は、 ls コマンドのバックグラウンドプロセスが正常に終了したことを示しています。 2番目は、別のコマンドのプロンプトです。

実行中のプロセスのリスト

次のように ps (プロセスステータス)コマンドを実行すると、独自のプロセスを簡単に確認できます-

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

psで最も一般的に使用されるフラグの1つは、次の例に示すように詳細情報を提供する -f (フルのf)オプションです-

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
*ps -f* コマンドで表示されるすべてのフィールドの説明は次のとおりです-
Sr.No. Column & Description
1

UID

このプロセスが属するユーザーID(実行している人)

2

PID

プロセスID

3

PPID

親プロセスID(それを開始したプロセスのID)

4

C

プロセスのCPU使用率

5

STIME

プロセス開始時間

6

TTY

プロセスに関連付けられた端末タイプ

7

TIME

プロセスにかかったCPU時間

8

CMD

このプロセスを開始したコマンド

*ps* コマンドと一緒に使用できる他のオプションがあります-
Sr.No. Option & Description
1

-a

すべてのユーザーに関する情報を表示します

2

-x

端末のないプロセスに関する情報を表示します

3

-u

-fオプションなどの追加情報を表示します

4

-e

拡張情報を表示します

プロセスの停止

プロセスの終了は、いくつかの異なる方法で実行できます。 多くの場合、コンソールベースのコマンドから、CTRL&plus;を送信します。 Cキーストローク(デフォルトの割り込み文字)はコマンドを終了します。 これは、プロセスがフォアグラウンドモードで実行されている場合に機能します。

プロセスがバックグラウンドで実行されている場合、 ps コマンドを使用してジョブIDを取得する必要があります。 その後、次のようにプロセスを強制終了するために kill コマンドを使用できます-

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

ここで、 kill コマンドは first_one プロセスを終了します。 プロセスが通常のkillコマンドを無視する場合は、次のように kill -9 の後にプロセスIDを使用できます-

$kill -9 6738
Terminated

親プロセスと子プロセス

各UNIXプロセスには、プロセスID(pid)と親プロセスID(ppid)の2つのID番号が割り当てられています。 システム内の各ユーザープロセスには、親プロセスがあります。

実行するコマンドのほとんどには、親としてシェルがあります。 このコマンドがプロセスIDと親プロセスIDの両方をリストした ps -f の例を確認してください。

ゾンビと孤児のプロセス

通常、子プロセスが強制終了されると、親プロセスは SIGCHLD シグナルを介して更新されます。 その後、親は必要に応じて他のタスクを実行したり、新しい子を再起動したりできます。 ただし、子が殺される前に親プロセスが殺されることもあります。 この場合、「すべてのプロセスの親」である init プロセスが新しいPPID(親プロセスID)になります。 場合によっては、これらのプロセスは孤立プロセスと呼ばれます。

プロセスが強制終了されても、 ps リストに Z 状態のプロセスが表示される場合があります。 これはゾンビまたは機能しないプロセスです。 プロセスは停止しており、使用されていません。 これらのプロセスは、孤立プロセスとは異なります。 実行は完了しましたが、プロセステーブルにエントリが見つかります。

デーモンプロセス

デーモンは、システム関連のバックグラウンドプロセスであり、多くの場合、他のプロセスからのルートおよびサービス要求の権限で実行されます。

デーモンには制御端末がありません。 /dev/tty を開くことはできません。 "ps -ef" を実行して tty フィールドを見ると、すべてのデーモンには tty の*?*があります。

正確には、デーモンはバックグラウンドで実行されるプロセスであり、通常は動作可能な何かが起こるのを待っています。 たとえば、印刷コマンドを待っているプリンタデーモン。

長時間の処理を必要とするプログラムがある場合は、それをデーモンにしてバックグラウンドで実行する価値があります。

トップコマンド

*top* コマンドは、さまざまな基準でソートされたプロセスをすばやく表示するための非常に便利なツールです。

これは、頻繁に更新され、物理メモリと仮想メモリ、CPU使用率、負荷平均、ビジープロセスに関する情報を表示する対話型診断ツールです。

topコマンドを実行し、さまざまなプロセスによるCPU使用率の統計を確認するための簡単な構文を次に示します-

$top

ジョブIDとプロセスID

バックグラウンドおよび中断されたプロセスは、通常*ジョブ番号(ジョブID)*を介して操作されます。 この番号はプロセスIDとは異なり、短いため使用されます。

さらに、ジョブは、連続して、または同時に実行される複数のプロセスで構成できます。 ジョブIDの使用は、個々のプロセスを追跡するよりも簡単です。

Unix-ネットワーク通信ユーティリティ

この章では、Unixのネットワーク通信ユーティリティについて詳しく説明します。 分散環境で作業する場合、リモートユーザーと通信する必要があり、リモートUnixマシンにもアクセスする必要があります。

ネットワーク化された分散環境でのユーザーの計算を支援するUnixユーティリティがいくつかあります。 この章ではそれらのいくつかをリストします。

pingユーティリティ

*ping* コマンドは、ネットワーク上で利用可能なホストにエコー要求を送信します。 このコマンドを使用すると、リモートホストが正常に応答しているかどうかを確認できます。

pingコマンドは次の場合に便利です-

  • ハードウェアとソフトウェアの問題の追跡と特定。
  • ネットワークおよびさまざまな外部ホストのステータスの決定。
  • ネットワークのテスト、測定、管理。

構文

以下は、ftpコマンドを使用するための簡単な構文です-

$ping hostname or ip-address

上記のコマンドは、1秒ごとに応答の出力を開始します。 コマンドを終了するには、 CNTRL&plus;を押してコマンドを終了できます。 C キー。

以下は、ネットワーク上で利用可能なホストの可用性を確認する例です-

$ping google.com
PING google.com (74.125.67.100) 56(84) bytes of data.
64 bytes from 74.125.67.100: icmp_seq = 1 ttl = 54 time = 39.4 ms
64 bytes from 74.125.67.100: icmp_seq = 2 ttl = 54 time = 39.9 ms
64 bytes from 74.125.67.100: icmp_seq = 3 ttl = 54 time = 39.3 ms
64 bytes from 74.125.67.100: icmp_seq = 4 ttl = 54 time = 39.1 ms
64 bytes from 74.125.67.100: icmp_seq = 5 ttl = 54 time = 38.8 ms
--- google.com ping statistics ---
22 packets transmitted, 22 received, 0% packet loss, time 21017ms
rtt min/avg/max/mdev = 38.867/39.334/39.900/0.396 ms
$

ホストが存在しない場合は、次の出力が表示されます-

$ping giiiiiigle.com
ping: unknown host giiiiigle.com
$

ftpユーティリティ

ここで、 ftp は* F ile T ransfer P * rotocolを表します。 このユーティリティは、あるコンピューターから別のコンピューターにファイルをアップロードおよびダウンロードするのに役立ちます。

ftpユーティリティには、独自のUnixライクなコマンドのセットがあります。 これらのコマンドは、次のようなタスクの実行に役立ちます-

  • リモートホストに接続してログインします。
  • ディレクトリをナビゲートします。
  • ディレクトリの内容を一覧表示します。
  • ファイルを配置および取得します。
  • asciiebcdic 、または binary としてファイルを転送します。

構文

以下は、ftpコマンドを使用するための簡単な構文です-

$ftp hostname or ip-address

上記のコマンドは、ログインIDとパスワードの入力を求めます。 認証されると、ログインアカウントのホームディレクトリにアクセスでき、さまざまなコマンドを実行できるようになります。

次の表は、いくつかの重要なコマンドを示しています-

Sr.No. Command & Description
1

put filename

ローカルマシンからリモートマシンにファイル名をアップロードします。

2

get filename

リモートマシンからローカルマシンにファイル名をダウンロードします。

3

mput file list

ローカルマシンからリモートマシンに複数のファイルをアップロードします。

4

mget file list

リモートマシンからローカルマシンに複数のファイルをダウンロードします。

5

prompt off

プロンプトをオフにします。 デフォルトでは、 mput または mget コマンドを使用してファイルをアップロードまたはダウンロードするプロンプトが表示されます。

6

prompt on

プロンプトをオンにします。

7

dir

リモートマシンの現在のディレクトリで使用可能なすべてのファイルを一覧表示します。

8

cd dirname

リモートマシンのディレクトリをdirnameに変更します。

9

lcd dirname

ローカルマシンのディレクトリをdirnameに変更します。

10

quit

現在のログインからのログアウトを支援します。

すべてのファイルが現在のディレクトリにダウンロードされるか、現在のディレクトリからアップロードされることに注意してください。 特定のディレクトリにファイルをアップロードする場合は、まずそのディレクトリに変更してから、必要なファイルをアップロードする必要があります。

以下は、いくつかのコマンドの動作を示す例です-

$ftp amrood.com
Connected to amrood.com.
220 amrood.com FTP server (Ver 4.9 Thu Sep 2 20:35:07 CDT 2009)
Name (amrood.com:amrood): amrood
331 Password required for amrood.
Password:
230 User amrood logged in.
ftp> dir
200 PORT command successful.
150 Opening data connection for/bin/ls.
total 1464
drwxr-sr-x   3 amrood   group       1024 Mar 11 20:04 Mail
drwxr-sr-x   2 amrood   group       1536 Mar  3 18:07 Misc
drwxr-sr-x   5 amrood   group        512 Dec  7 10:59 OldStuff
drwxr-sr-x   2 amrood   group       1024 Mar 11 15:24 bin
drwxr-sr-x   5 amrood   group       3072 Mar 13 16:10 mpl
-rw-r--r--   1 amrood   group     209671 Mar 15 10:57 myfile.out
drwxr-sr-x   3 amrood   group        512 Jan  5 13:32 public
drwxr-sr-x   3 amrood   group        512 Feb 10 10:17 pvm3
226 Transfer complete.
ftp> cd mpl
250 CWD command successful.
ftp> dir
200 PORT command successful.
150 Opening data connection for/bin/ls.
total 7320
-rw-r--r--   1 amrood   group       1630 Aug  8 1994  dboard.f
-rw-r-----   1 amrood   group       4340 Jul 17 1994  vttest.c
-rwxr-xr-x   1 amrood   group     525574 Feb 15 11:52 wave_shift
-rw-r--r--   1 amrood   group       1648 Aug  5 1994  wide.list
-rwxr-xr-x   1 amrood   group       4019 Feb 14 16:26 fix.c
226 Transfer complete.
ftp> get wave_shift
200 PORT command successful.
150 Opening data connection for wave_shift (525574 bytes).
226 Transfer complete.
528454 bytes received in 1.296 seconds (398.1 Kbytes/s)
ftp> quit
221 Goodbye.
$

telnetユーティリティ

リモートのUnixマシンに接続して、そのマシンでリモートで作業する必要がある場合があります。 Telnet は、あるサイトのコンピューターユーザーが接続してログインし、別のサイトのコンピューターで作業を行えるようにするユーティリティです。

Telnetを使用してログインすると、リモート接続されたマシンですべてのアクティビティを実行できます。 以下は、Telnetセッションの例です-

C:>telnet amrood.com
Trying...
Connected to amrood.com.
Escape character is '^]'.

login: amrood
amrood's Password:
*****************************************************
 **
 **
 *WELCOME TO AMROOD.COM                         *
 **
 **
*****************************************************

Last unsuccessful login: Fri Mar  3 12:01:09 IST 2009
Last login: Wed Mar  8 18:33:27 IST 2009 on pts/10

   {  do your work }

$ logout
Connection closed.
C:>

指ユーティリティ

*finger* コマンドは、特定のホスト上のユーザーに関する情報を表示します。 ホストはローカルでもリモートでもかまいません。

セキュリティ上の理由から、他のシステムではFingerが無効になっている場合があります。

以下は、fingerコマンドを使用するための簡単な構文です-

ローカルマシン上のすべてのログインユーザーを確認します-

$ finger
Login     Name       Tty      Idle  Login Time   Office
amrood               pts/0          Jun 25 08:03 (62.61.164.115)

ローカルマシンで利用可能な特定のユーザーに関する情報を取得します-

$ finger amrood
Login: amrood                           Name: (null)
Directory:/home/amrood                 Shell:/bin/bash
On since Thu Jun 25 08:03 (MST) on pts/0 from 62.61.164.115
No mail.
No Plan.

リモートマシン上のすべてのログインユーザーを確認してください-

$ finger @avtar.com
Login     Name       Tty      Idle  Login Time   Office
amrood               pts/0          Jun 25 08:03 (62.61.164.115)

リモートマシン上で利用可能な特定のユーザーに関する情報を取得します-

$ finger [email protected]
Login: amrood                           Name: (null)
Directory:/home/amrood                 Shell:/bin/bash
On since Thu Jun 25 08:03 (MST) on pts/0 from 62.61.164.115
No mail.
No Plan.

Unix-viエディターチュートリアル

この章では、Uniでのviエディターの動作を理解します。 Unixでファイルを編集するには多くの方法があります。 画面指向のテキストエディタ vi を使用してファイルを編集するのが最良の方法の1つです。 このエディターを使用すると、ファイル内の他の行との関連で行を編集できます。

*VIM* と呼ばれるviエディターの改良バージョンも利用可能になりました。 ここで、VIMは* *Vi IM* *の略です。

viは、一般的にUnixエディターの事実上の標準と見なされます。

  • 通常、Unixシステムのすべてのフレーバーで使用できます。

  • その実装は、全体的に非常に似ています。

  • 必要なリソースはごくわずかです。

  • edex などの他のエディターよりもユーザーフレンドリーです。

    *vi* エディタを使用して、既存のファイルを編集したり、新しいファイルを最初から作成したりできます。 このエディターを使用して、テキストファイルを読み取ることもできます。

viエディターの開始

次の表は、viエディターを使用するための基本的なコマンドを示しています-

Sr.No. Command & Description
1

vi filename

まだ存在しない場合は新しいファイルを作成し、存在しない場合は既存のファイルを開きます。

2

vi -R filename

既存のファイルを読み取り専用モードで開きます。

3

view filename

既存のファイルを読み取り専用モードで開きます。

以下は、現在の作業ディレクトリにまだ存在しない場合に新しいファイル testfile を作成する例です-

$vi testfile

上記のコマンドは、次の出力を生成します-

|
~
~
~
~
~
~
~
~
~
~
~
~
"testfile" [New File]

カーソルの後の各行に*チルダ*(〜)があります。 チルダは未使用の行を表します。 行がチルダで始まっておらず、空白のように見える場合、スペース、タブ、改行、またはその他の表示できない文字が存在します。

これで、作業を開始する1つの開いているファイルがあります。 さらに先に進む前に、いくつかの重要な概念を理解しましょう。

動作モード

viエディターでの作業中、通常、次の2つのモードに遭遇します-

  • コマンドモード-このモードでは、ファイルの保存、コマンドの実行、カーソルの移動、行または単語のカット(ヤンク)および貼り付け、検索および置換などの管理タスクを実行できます。 このモードでは、入力した内容はすべてコマンドとして解釈されます。
  • 挿入モード-このモードでは、テキストをファイルに挿入できます。 このモードで入力されたものはすべて入力として解釈され、ファイルに配置されます。

viは常に*コマンドモード*で起動します。 テキストを入力するには、 i と入力するだけの挿入モードである必要があります。 挿入モードを終了するには、 Esc キーを押します。これにより、コマンドモードに戻ります。

ヒント-どのモードにいるかわからない場合は、Escキーを2回押します。これにより、コマンドモードに移動します。 viエディターを使用してファイルを開きます。 いくつかの文字を入力することから始めてから、違いを理解するためにコマンドモードに入ります。

viから抜け出す

viを終了するコマンドは*:q です。 コマンドモードになったら、コロンと「q」を入力し、リターンを押します。 ファイルが何らかの方法で変更された場合、エディターはこれを警告し、終了させません。 このメッセージを無視するには、保存せずにviを終了するコマンドは:q!*です。 これにより、変更を保存せずにviを終了できます。

エディターの内容を保存するコマンドは*:w です。 上記のコマンドをquitコマンドと組み合わせるか、:wq *を使用してリターンできます。

変更を保存してvi を終了する最も簡単な方法は、ZZコマンドを使用することです。 コマンドモードで、 *ZZ と入力します。 ZZ コマンドは、*:wq *コマンドと同じように機能します。

ファイルの特定の名前を指定/指定する場合は、:w *の後に指定することで指定できます。 たとえば、作業中のファイルを *filename2 という別のファイル名として保存する場合は、*:w filename2 *と入力して戻ります。

ファイル内を移動する

テキストに影響を与えずにファイル内を移動するには、コマンドモードにする必要があります(Escキーを2回押します)。 次の表は、一度に1文字を移動するために使用できるいくつかのコマンドを示しています-

Sr.No. Command & Description
1

k

カーソルを1行上に移動します

2

j

カーソルを1行下に移動します

3

h

カーソルを1文字左に移動します

4

l

カーソルを1文字右に移動します

ファイル内を移動するには、次の点を考慮する必要があります-

  • viでは大文字と小文字が区別されます。 コマンドを使用するときは、大文字に注意する必要があります。
  • viのほとんどのコマンドの前には、アクションを発生させたい回数を指定できます。 たとえば、 2j はカーソルをカーソル位置の2行下に移動します。

viでファイル内を移動する方法は他にもたくさんあります。 コマンドモードである必要があることに注意してください(* Escを2回押す*)。 次の表は、ファイル内を移動するためのいくつかのコマンドを示しています-

以下に、ファイル内を移動するコマンドのリストを示します。

Sr.No. Command & Description
1

0 or VERBAR

カーソルを行の先頭に配置します

2

$

カーソルを行末に配置します

3

w

次の単語にカーソルを置きます

4

b

前の単語にカーソルを置きます

5

(

現在の文の先頭にカーソルを置きます

6

)

次の文の先頭にカーソルを置きます

7

E

空白で区切られた単語の末尾に移動します

8

\{

段落を後ろに移動します

9

}

段落を前に移動します

10 *[[Moves a section back
11

]]

セクションを前方に移動します

12 *n

現在の行の列 n に移動します

13

1G

ファイルの最初の行に移動します

14

G

ファイルの最終行に移動します

15

nG

ファイルの n ^ th ^ 行に移動します

16

:n

ファイルの n ^ th ^ 行に移動します

17

fc

  • c* に進みます
18

Fc

  • c* に戻ります
19

H

画面の上部に移動します

20

nH

画面の上部から n ^ th ^ 行に移動します

21

M

画面の中央に移動します

22

L

画面の一番下に移動する

23

nL

画面の下部から n ^ th ^ 行に移動します

24

制御コマンド

次のコマンドは、以下の表に示す機能を実行するためにコントロールキーと一緒に使用できます-

以下に制御コマンドのリストを示します。

Sr.No. Command & Description
1

CTRLPLUSd

1/2画面進む

2

CTRLPLUSf

全画面を1つ進めます

3

CTRLPLUSu

半画面前に移動します

4

CTRLPLUSb

1画面前に移動します

5

CTRLPLUSe

画面を1行上に移動します

6

CTRLPLUSy

画面を1行下に移動します

7

CTRLPLUSu

画面を1/2ページ上に移動します

8

CTRLPLUSd

画面を1/2ページ下に移動します

9

CTRLPLUSb

画面を1ページ上に移動します

10

CTRLPLUSf

画面を1ページ下に移動します

11

CTRLPLUSI

画面を再描画します

ファイルを編集する

ファイルを編集するには、挿入モードである必要があります。 コマンドモードから挿入モードに入るための多くの方法があります-

Sr.No. Command & Description
1

i

現在のカーソル位置の前にテキストを挿入します

2

I

現在の行の先頭にテキストを挿入します

3

a

現在のカーソル位置の後にテキストを挿入します

4

A

現在の行の末尾にテキストを挿入します

5

o

カーソル位置の下にテキスト入力用の新しい行を作成します

6

O

カーソル位置の上にテキスト入力用の新しい行を作成します

キャラクターを削除する

開いているファイルの文字と行を削除するために使用できる重要なコマンドのリストは次のとおりです-

Sr.No. Command & Description
1

x

カーソル位置の下の文字を削除します

2

X

カーソル位置の前の文字を削除します

3

dw

現在のカーソル位置から次の単語まで削除します

4

d^

現在のカーソル位置から行の先頭までを削除します

5

d$

現在のカーソル位置から行末までを削除します

6

D

カーソル位置から現在の行の末尾までを削除します

7

dd

カーソルがある行を削除します

上記のように、viのほとんどのコマンドは、アクションを発生させたい回数によって前置できます。 たとえば、 2x はカーソル位置の下の2文字を削除し、 2dd はカーソルが置かれている2行を削除します。

さらに先に進む前に、コマンドを実行することをお勧めします。

変更コマンド

viの文字、単語、または行を削除せずに変更することもできます。 関連するコマンドは次のとおりです-

Sr.No. Command & Description
1

cc

行の内容を削除し、挿入モードのままにします。

2

cw

カーソルが置かれている単語をカーソルから単語の小文字の w 末尾に変更します。

3

r

カーソルの下の文字を置き換えます。 置換が入力されると、viはコマンドモードに戻ります。

4

R

現在カーソルの下にある文字で始まる複数の文字を上書きします。 上書きを停止するには、 Esc を使用する必要があります。

5

s

現在の文字を入力した文字に置き換えます。 その後、挿入モードのままになります。

6

S

カーソルが置かれている行を削除し、新しいテキストに置き換えます。 新しいテキストが入力された後、viは挿入モードのままになります。

コマンドのコピーと貼り付け

あなたは1つの場所から行または単語をコピーしてから、次のコマンドを使用して別の場所に貼り付けることができます-

Sr.No. Command & Description
1

yy

現在の行をコピーします。

2

yw

小文字のwカーソルが置かれている文字から、単語の最後まで現在の単語をコピーします。

3

p

コピーしたテキストをカーソルの後に配置します。

4

P

カーソルの前にヤンクしたテキストを置きます。

高度なコマンド

日々の編集を簡素化し、viのより効率的な使用を可能にするいくつかの高度なコマンドがあります-

高度なコマンドのリストを以下に示します。

Sr.No. Command & Description
1

J

現在の行を次の行と結合します。 j個のコマンドが多数の行を結合します。

2

<<

現在の行を1シフト幅左にシフトします。

3

>>

現在の行を1シフト幅だけ右にシフトします。

4

~

カーソルの下の文字の大文字と小文字を切り替えます。

5

^G

CtrlキーとGキーを同時に押して、現在のファイル名とステータスを表示します。

6

U

現在の行を、カーソルが行に入る前の状態に戻します。

7

u

これは、ファイルで行われた最後の変更を元に戻すのに役立ちます。 もう一度「u」と入力すると、変更が再実行されます。

8

J

現在の行を次の行と結合します。 カウントはその数の行を結合します。

9

:f

ファイル内の現在の位置を%で表示し、ファイル名、ファイルの総数を表示します。

10

:f filename

現在のファイルの名前をfilenameに変更します。

11

:w filename

ファイルfilenameに書き込みます。

12

:e filename

ファイル名を持つ別のファイルを開きます。

13

:cd dirname

現在の作業ディレクトリをdirnameに変更します。

14

:e #

2つの開いているファイルを切り替えます。

15

:n

viを使用して複数のファイルを開く場合は、*:n *を使用してシリーズの次のファイルに移動します。

16

:p

viを使用して複数のファイルを開く場合は、*:p *を使用して、シリーズの前のファイルに移動します。

17

:N

viを使用して複数のファイルを開く場合は、*:N *を使用して、シリーズの前のファイルに移動します。

18

:r file

ファイルを読み取り、現在の行の後に挿入します。

19

:nr file

ファイルを読み取り、 n 行の後に挿入します。

単語と文字の検索

viエディターには、 stringcharacter の2種類の検索があります。 文字列検索では、 / および*?*コマンドが使用されます。 これらのコマンドを開始すると、入力したばかりのコマンドが画面の最後の行に表示され、検索する特定の文字列を入力します。

これらの2つのコマンドは、検索が行われる方向のみが異なります-

  • / コマンドは、ファイル内を前方(下方)に検索します。

  • *?*コマンドは、ファイル内を逆方向(上方向)に検索します。

    *n* および *N* コマンドは、前の検索コマンドをそれぞれ同じ方向または反対方向に繰り返します。 一部の文字には特別な意味があります。 これらの文字の前にバックスラッシュ( *\* )を付けて、検索式の一部として含める必要があります。
Sr.No. Character &Description
1

^

行の先頭で検索します(検索式の先頭で使用)。

2

.

単一の文字に一致します。

3 0個以上の前の文字と一致します。
4

$

行末(検索式の最後で使用)。

5

[

一致する式または一致しない式のセットを開始します。

6

<

これは、バックスラッシュでエスケープされた式に入れられ、単語の末尾または先頭を見つけます。

7

>

これにより、上記の「* <*」文字の説明を確認できます。

文字検索は、コマンドの後に入力された文字を見つけるために1行内で検索します。 f および F コマンドは、現在の行の文字のみを検索します。 f は前方を検索し、 F は後方を検索し、見つかった文字の位置にカーソルが移動します。

*t* および *T* コマンドは現在の行の文字のみを検索しますが、 *t* の場合、カーソルは文字の前の位置に移動し、 *T* は行を後方の文字の位置まで検索します。

設定コマンド

次の*:set コマンドを使用して、vi画面の外観を変更できます。 コマンドモードに入ったら、:set *に続けて次のコマンドを入力します。

Sr.No. Command & Description
1

:set ic

検索時に大文字と小文字を区別しません

2

:set ai

自動インデントを設定します

3

:set noai

自動インデントを解除します

4

:set nu

左側に行番号を持つ行を表示します

5

:set sw

ソフトウェアのタブストップの幅を設定します。 たとえば、このコマンドでシフト幅を4に設定します— *:set sw = 4 *

6
  • :set ws*

_wrapscan_が設定されていて、ファイルの下部に単語が見つからない場合、最初から検索を試みます

7

:set wm

このオプションの値がゼロより大きい場合、エディターは自動的に「ワードラップ」します。 たとえば、折り返しマージンを2文字に設定するには、次のように入力します。*:set wm = 2 *

8
  • :set ro*

ファイルの種類を「読み取り専用」に変更します

9

:set term

端末タイプを印刷します

10

:set bf

入力から制御文字を破棄します

コマンドを実行する

viには、エディター内からコマンドを実行する機能があります。 コマンドを実行するには、コマンドモードに移動して*:!*コマンドを入力するだけです。

たとえば、そのファイル名でファイルを保存する前にファイルが存在するかどうかを確認する場合は、 :!と入力できます。 ls とすると、 ls の出力が画面に表示されます。

任意のキー(またはコマンドのエスケープシーケンス)を押して、viセッションに戻ることができます。

テキストを置き換える

置換コマンド(:s/)を使用すると、ファイル内の単語または単語のグループをすばやく置き換えることができます。 以下は、テキストを置き換える構文です-

:s/search/replace/g
*g* はグローバルを表します。 このコマンドの結果、カーソルの行にあるすべてのオカレンスが変更されます。

注意すべき重要なポイント

次のポイントは、viでの成功に追加されます-

  • コマンドを使用するには、コマンドモードである必要があります。 (コマンドモードになっていることを確認するために、いつでもEscを2回押します。)
  • コマンドには注意が必要です。 これらは大文字と小文字が区別されます。
  • テキストを入力するには、挿入モードである必要があります。

Unix-シェルとは何ですか?

*Shell* は、Unixシステムへのインターフェースを提供します。 ユーザーからの入力を収集し、その入力に基づいてプログラムを実行します。 プログラムの実行が終了すると、プログラムの出力が表示されます。

シェルは、コマンド、プログラム、およびシェルスクリプトを実行できる環境です。 オペレーティングシステムのフレーバーが異なるように、シェルのフレーバーも異なります。 シェルの各フレーバーには、認識されるコマンドと関数の独自のセットがあります。

シェルプロンプト

*command prompt* と呼ばれるプロンプト *$* は、シェルによって発行されます。 プロンプトが表示されている間に、コマンドを入力できます。
*Enter* を押すと、シェルは入力を読み取ります。 入力の最初の単語を見て、実行するコマンドを決定します。 単語は切れ目のない文字のセットです。 スペースとタブで単語を区切ります。

以下は、現在の日付と時刻を表示する date コマンドの簡単な例です-

$date
Thu Jun 25 08:30:19 MST 2009

環境チュートリアルで説明されている環境変数PS1を使用して、コマンドプロンプトをカスタマイズできます。

シェルタイプ

Unixでは、シェルの2つの主要なタイプがあります-

  • * Bourneシェル*-Bourneタイプのシェルを使用している場合、 $ 文字がデフォルトのプロンプトです。
  • * Cシェル*-Cタイプのシェルを使用している場合、%文字がデフォルトのプロンプトです。

Bourne Shellには次のサブカテゴリがあります-

  • ボーンシェル(sh)
  • Kornシェル(ksh)
  • Bourne Againシェル(bash)
  • POSIXシェル(sh)

さまざまなCタイプのシェルが続きます-

  • Cシェル(csh)
  • TENEX/TOPS Cシェル(tcsh)

オリジナルのUnixシェルは、1970年代半ばにStephen Rによって書かれました。 ニュージャージー州のAT&T Bell Labsにいたときのボーン。

Bourneシェルは、Unixシステムで最初に登場したシェルであるため、「シェル」と呼ばれます。

Bourneシェルは通常、ほとんどのバージョンのUnixで /bin/sh としてインストールされます。 このため、異なるバージョンのUnixで使用できるスクリプトを作成するのに最適なシェルです。

この章では、Borne Shellに基づいたシェルの概念のほとんどについて説明します。

シェルスクリプト

シェルスクリプトの基本概念はコマンドのリストであり、実行順にリストされています。 優れたシェルスクリプトには、ステップを説明する*#*記号が前に付いたコメントがあります。

値Aが値Bよりも大きい、大量のデータを通過できるループ、データの読み取りと保存を行うファイル、データの読み取りと保存を行う変数などの条件付きテストがあり、スクリプトには関数が含まれる場合があります。

次のセクションで多くのスクリプトを作成します。 これは、シェル環境に何をいつ実行するかを指示するすべてのコマンドといくつかの他の必要なコンストラクトを配置する単純なテキストファイルです。

シェルスクリプトと関数は両方とも解釈されます。 これは、それらがコンパイルされていないことを意味します。

サンプルスクリプト

*test.sh* スクリプトを作成するとします。 すべてのスクリプトの拡張子は *.sh* であることに注意してください。 スクリプトに何かを追加する前に、シェルスクリプトが開始されていることをシステムに警告する必要があります。 これは、 *shebang* コンストラクトを使用して行われます。 たとえば-
#!/bin/sh

これは、後続のコマンドがBourneシェルによって実行されることをシステムに伝えます。 _ *#*記号はハッシュと呼ばれ、! シンボルはbang_と呼ばれます。

これらのコマンドを含むスクリプトを作成するには、最初にシェバン行を入れてからコマンドを追加します-

#!/bin/bash
pwd
ls

シェルコメント

次のようにスクリプトにコメントを入力できます-

#!/bin/bash

# Author : Zara Ali
# Copyright (c) finddevguides.com
# Script follows here:
pwd
ls

上記のコンテンツを保存し、スクリプトを実行可能にします-

$chmod +x test.sh

これで、シェルスクリプトを実行する準備ができました-

$./test.sh

実行すると、次の結果が表示されます-

/home/amrood
index  unix-basic_utilities  unix-directories
test.sh    unix-communication    unix-environment

-現在のディレクトリで利用可能なプログラムを実行するには、*。/program_name *を使用します

拡張シェルスクリプト

シェルスクリプトには、シェル環境に何をいつ実行するかを指示するいくつかの必要な構造があります。 もちろん、ほとんどのスクリプトは上記のものよりも複雑です。

シェルは、結局のところ、変数、制御構造などを備えた実際のプログラミング言語です。 スクリプトがどんなに複雑になっても、それはまだ順番に実行されるコマンドのリストにすぎません。

次のスクリプトは、キーボードから入力を受け取り、変数PERSONの値として割り当て、最終的にそれをSTDOUTに出力する read コマンドを使用します。

#!/bin/sh

# Author : Zara Ali
# Copyright (c) finddevguides.com
# Script follows here:

echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

スクリプトのサンプル実行はここにあります-

$./test.sh
What is your name?
Zara Ali
Hello, Zara Ali
$

Unix-シェル変数の使用

この章では、Unixでシェル変数を使用する方法を学習します。 変数は、値を割り当てる文字列です。 割り当てられる値は、数値、テキスト、ファイル名、デバイス、またはその他の種類のデータです。

変数は、実際のデータへのポインタにすぎません。 シェルを使用すると、変数を作成、割り当て、および削除できます。

変数名

変数の名前には、文字(a〜zまたはA〜Z)、数字(0〜9)、または下線文字(_)のみを含めることができます。

慣例により、Unixシェル変数の名前は大文字になります。

次の例は、有効な変数名です-

_ALI
TOKEN_A
VAR_1
VAR_2

以下は無効な変数名の例です-

2_VAR
-VARIABLE
VAR1-VAR2
VAR_A!

*、*-*などの他の文字を使用できないのは、これらの文字がシェルにとって特別な意味を持つためです。

変数の定義

変数は次のように定義されています-

variable_name=variable_value

たとえば-

NAME="Zara Ali"

上記の例では、変数NAMEを定義し、それに値「Zara Ali」を割り当てています。 このタイプの変数は*スカラー変数*と呼ばれます。 スカラー変数は、一度に1つの値しか保持できません。

シェルを使用すると、必要な値を変数に保存できます。 たとえば-

VAR1="Zara Ali"
VAR2=100

値へのアクセス

変数に保存されている値にアクセスするには、その名前の前にドル記号( $ )を付けます-

たとえば、次のスクリプトは、定義済み変数NAMEの値にアクセスし、STDOUTに出力します-

#!/bin/sh

NAME="Zara Ali"
echo $NAME

上記のスクリプトは、次の値を生成します-

Zara Ali

読み取り専用変数

シェルは、読み取り専用コマンドを使用して変数を読み取り専用としてマークする方法を提供します。 変数が読み取り専用としてマークされた後、その値は変更できません。

たとえば、次のスクリプトはNAMEの値を変更しようとしているときにエラーを生成します-

#!/bin/sh

NAME="Zara Ali"
readonly NAME
NAME="Qadiri"

上記のスクリプトは、次の結果を生成します-

/bin/sh: NAME: This variable is read only.

変数の設定解除

変数を設定解除または削除すると、追跡する変数のリストから変数を削除するようシェルに指示されます。 変数の設定を解除すると、変数に保存されている値にアクセスできなくなります。

以下は、 unset コマンドを使用して定義済み変数を設定解除する構文です-

unset variable_name

上記のコマンドは、定義された変数の値を設定解除します。 コマンドがどのように機能するかを示す簡単な例を次に示します-

#!/bin/sh

NAME="Zara Ali"
unset NAME
echo $NAME

上記の例では何も出力されません。 unsetコマンドを使用して、 readonly とマークされている変数を unset することはできません。

変数の種類

シェルが実行されているとき、変数の3つの主なタイプが存在します-

  • ローカル変数-ローカル変数は、シェルの現在のインスタンス内に存在する変数です。 シェルによって開始されるプログラムでは使用できません。 これらはコマンドプロンプトで設定されます。
  • 環境変数-環境変数は、シェルのすべての子プロセスで使用できます。 一部のプログラムは、正しく機能するために環境変数を必要とします。 通常、シェルスクリプトは、実行するプログラムに必要な環境変数のみを定義します。
  • シェル変数-シェル変数は、シェルによって設定される特殊な変数であり、正しく機能するためにシェルに必要です。 これらの変数の一部は環境変数ですが、他の変数はローカル変数です。

Unix-特殊変数

この章では、Unixの特殊変数について詳しく説明します。 前の章の1つで、変数名に特定の非英数字を使用する場合に注意する方法を理解しました。 これは、これらの文字が特殊なUnix変数の名前で使用されているためです。 これらの変数は、特定の機能用に予約されています。

たとえば、 $ 文字は、現在のシェルのプロセスID番号、またはPIDを表します-

$echo $$

上記のコマンドは、現在のシェルのPIDを書き込みます-

29949

次の表は、シェルスクリプトで使用できるいくつかの特殊変数を示しています-

Sr.No. Variable & Description
1

$0

現在のスクリプトのファイル名。

2

$n

これらの変数は、スクリプトが呼び出された引数に対応しています。 ここで、 n は引数の位置に対応する正の10進数です(最初の引数は$ 1、2番目の引数は$ 2などです)。

3

$#

スクリプトに提供される引数の数。

4

$*

すべての引数は二重引用符で囲まれています。 スクリプトが2つの引数を受け取る場合、$ *は$ 1 $ 2と同等です。

5

$@

すべての引数は個別に二重引用符で囲まれています。 スクリプトが2つの引数を受け取る場合、$ @は$ 1 $ 2と同等です。

6

$?

最後に実行されたコマンドの終了ステータス。

7

$$

現在のシェルのプロセス番号。 シェルスクリプトの場合、これは実行中のプロセスIDです。

8

$!

最後のバックグラウンドコマンドのプロセス番号。

コマンドライン引数

コマンドライン引数$ 1、$ 2、$ 3、…​ $ 9は位置パラメータであり、$ 0は実際のコマンド、プログラム、シェルスクリプト、または関数を指し、$ 1、$ 2、$ 3、…​ $ 9はコマンド。

次のスクリプトは、コマンドラインに関連するさまざまな特殊変数を使用します-

#!/bin/sh

echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

上記のスクリプトの実行例を次に示します-

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

特別なパラメーター$ *および$ @

すべてのコマンドライン引数に一度にアクセスできる特別なパラメーターがあります。 $ と *$ @ は、二重引用符 "" で囲まれていない限り、両方とも同じように動作します。

両方のパラメーターは、コマンドライン引数を指定します。 ただし、「$ *」特殊パラメーターはリスト全体をスペースで区切った1つの引数として受け取り、「$ @」特殊パラメーターはリスト全体を受け取って個別の引数に分けます。

以下に示すようにシェルスクリプトを記述して、$ *または$ @のいずれかの特殊パラメーターを使用して、不明な数のコマンドライン引数を処理できます-

#!/bin/sh

for TOKEN in $*
do
   echo $TOKEN
done

上記のスクリプトの実行例を次に示します-

$./test.sh Zara Ali 10 Years Old
Zara
Ali
10
Years
Old

-ここで do …​ done は、後続のチュートリアルで説明するループの一種です。

終了ステータス

  • $?*変数は、前のコマンドの終了ステータスを表します。

終了ステータスは、すべてのコマンドが完了すると返される数値です。 原則として、ほとんどのコマンドは、成功した場合は終了ステータス0を返し、失敗した場合は1を返します。

一部のコマンドは、特定の理由で追加の終了ステータスを返します。 たとえば、一部のコマンドはエラーの種類を区別し、特定の種類の障害に応じてさまざまな終了値を返します。

以下は成功したコマンドの例です-

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$

Unix-シェル配列の使用

この章では、Unixでシェル配列を使用する方法について説明します。 シェル変数は、単一の値を保持するのに十分な能力があります。 これらの変数はスカラー変数と呼ばれます。

シェルは、*配列変数*と呼ばれる異なるタイプの変数をサポートしています。 これは、同時に複数の値を保持できます。 配列は、一連の変数をグループ化する方法を提供します。 必要な変数ごとに新しい名前を作成する代わりに、他のすべての変数を格納する単一の配列変数を使用できます。

シェル変数について説明したすべての命名規則は、配列の命名時に適用できます。

配列値の定義

配列変数とスカラー変数の違いは、次のように説明できます。

さまざまな学生の名前を変数のセットとして表現しようとしているとします。 個々の変数のそれぞれは、次のようにスカラー変数です-

NAME01="Zara"
NAME02="Qadir"
NAME03="Mahnaz"
NAME04="Ayan"
NAME05="Daisy"

単一の配列を使用して、上記のすべての名前を格納できます。 以下は、配列変数を作成する最も簡単な方法です。 これは、インデックスの1つに値を割り当てるのに役立ちます。

array_name[index]=value

ここで、_array_name_は配列の名前、_index_は設定する配列内のアイテムのインデックス、valueはそのアイテムに設定する値です。

例として、次のコマンド-

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
*ksh* シェルを使用している場合、配列初期化の構文は次のとおりです-
set -A array_name value1 value2 ... valuen
*bash* シェルを使用している場合、配列初期化の構文は次のとおりです-
array_name=(value1 ... valuen)

配列値へのアクセス

配列変数を設定した後、次のようにアクセスします-

${array_name[index]}

ここで、_array_name_は配列の名前であり、_index_はアクセスする値のインデックスです。 以下は、概念を理解するための例です-

#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

上記の例では、次の結果が生成されます-

$./test.sh
First Index: Zara
Second Index: Qadir

次のいずれかの方法で配列内のすべての項目にアクセスできます-

${array_name[*]}
${array_name[@]}

ここで、 array_name は、関心のある配列の名前です。 次の例では、概念を理解するのに役立ちます-

#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"

上記の例では、次の結果が生成されます-

$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

Unix-シェルの基本演算子

各シェルではさまざまな演算子がサポートされています。 この章では、Bourneシェル(デフォルトシェル)について詳しく説明します。

私たちは今、次の演算子について説明します-

  • 算術演算子
  • 関係演算子
  • ブール演算子
  • 文字列演算子
  • ファイルテスト演算子

Bourneシェルにはもともと単純な算術演算を実行するメカニズムはありませんでしたが、 awk または expr のいずれかの外部プログラムを使用します。

次の例は、2つの数字を追加する方法を示しています-

#!/bin/sh

val=`expr 2 + 2`
echo "Total value : $val"

上記のスクリプトは、次の結果を生成します-

Total value : 4

追加しながら、次の点を考慮する必要があります-

  • 演算子と式の間にはスペースが必要です。 たとえば、2&plus; 2は正しくありません。 2&plus;と書く必要があります。 2。
  • 完全な式は、バックティックと呼ばれる ’’ で囲む必要があります。

算術演算子

次の算術演算子は、Bourne Shellでサポートされています。

変数 a が10を保持し、変数 b が20を保持すると仮定します-

リンク:/unix/unix-arithmetic-operators [例を表示]

Operator Description Example
PLUS (Addition) Adds values on either side of the operator expr $a PLUS $b will give 30
- (Subtraction) Subtracts right hand operand from left hand operand expr $a - $b will give -10
* (Multiplication) Multiplies values on either side of the operator expr $a \* $b will give 200
/(Division) Divides left hand operand by right hand operand expr $b/$a will give 2
% (Modulus) Divides left hand operand by right hand operand and returns remainder expr $b % $a will give 0
= (Assignment) Assigns right operand in left operand a = $b would assign value of b into a
== (Equality) Compares two numbers, if both are same then returns true. [ $a == $b ] would return false.
!= (Not Equality) Compares two numbers, if both are different then returns true. [ $a != $b ] would return true.

すべての条件式は、スペースを含む角カッコ内にある必要があることを理解することが非常に重要です。たとえば、 [$ a == $ b] は正しいのに対し、 [$ a == $ b] は正しくありません。

すべての算術計算は長整数を使用して行われます。

関係演算子

Bourne Shellは、数値に固有の次の関係演算子をサポートしています。 これらの演算子は、値が数値でない限り、文字列値に対して機能しません。

たとえば、次の演算子は、10と20の間、および「10」と「20」の間の関係をチェックしますが、「10」と「20」の間ではありません。

変数 a が10を保持し、変数 b が20を保持すると仮定します-

リンク:/unix/unix-relational-operators [例を表示]

Operator Description Example
-eq Checks if the value of two operands are equal or not; if yes, then the condition becomes true. [ $a -eq $b ] is not true.
-ne Checks if the value of two operands are equal or not; if values are not equal, then the condition becomes true. [ $a -ne $b ] is true.
-gt Checks if the value of left operand is greater than the value of right operand; if yes, then the condition becomes true. [ $a -gt $b ] is not true.
-lt Checks if the value of left operand is less than the value of right operand; if yes, then the condition becomes true. [ $a -lt $b ] is true.
-ge Checks if the value of left operand is greater than or equal to the value of right operand; if yes, then the condition becomes true. [ $a -ge $b ] is not true.
-le Checks if the value of left operand is less than or equal to the value of right operand; if yes, then the condition becomes true. [ $a -le $b ] is true.

すべての条件式は、周囲にスペースがある角括弧内に配置する必要があることを理解することが非常に重要です。 たとえば、 [$ a ⇐ $ b] は正しいのに対し、 [$ a ⇐ $ b] は正しくありません。

ブール演算子

次のブール演算子は、Bourne Shellでサポートされています。

変数 a が10を保持し、変数 b が20を保持すると仮定します-

link:/unix/unix-boolean-operators [例を表示]

Operator Description Example
! This is logical negation. This inverts a true condition into false and vice versa. [ ! false ] is true.
*-o * This is logical* OR*. If one of the operands is true, then the condition becomes true. [ $a -lt 20 -o $b -gt 100 ] is true.
*-a * This is logical* AND*. If both the operands are true, then the condition becomes true otherwise false. [ $a -lt 20 -a $b -gt 100 ] is false.

文字列演算子

次の文字列演算子は、Bourne Shellでサポートされています。

変数 a が「abc」を保持し、変数 b が「efg」を保持すると仮定します-

link:/unix/unix-string-operators [例を表示]

Operator Description Example
= Checks if the value of two operands are equal or not; if yes, then the condition becomes true. [ $a = $b ] is not true.
!= Checks if the value of two operands are equal or not; if values are not equal then the condition becomes true. [ $a != $b ] is true.
-z Checks if the given string operand size is zero; if it is zero length, then it returns true. [ -z $a ] is not true.
-n Checks if the given string operand size is non-zero; if it is nonzero length, then it returns true. [ -n $a ] is not false.
*str * Checks if* str* is not the empty string; if it is empty, then it returns false. [ $a ] is not false.

ファイルテスト演算子

Unixファイルに関連付けられたさまざまなプロパティをテストするために使用できる演算子がいくつかあります。

変数 file には、サイズが100バイトで、 readwriteexecute のアクセス許可がある既存のファイル名「test」が含まれていると仮定します-

link:/unix/unix-file-operators [例を表示]

Operator Description Example
-b file Checks if file is a block special file; if yes, then the condition becomes true. [ -b $file ] is false.
-c file Checks if file is a character special file; if yes, then the condition becomes true. [ -c $file ] is false.
-d file Checks if file is a directory; if yes, then the condition becomes true. [ -d $file ] is not true.
-f file Checks if file is an ordinary file as opposed to a directory or special file; if yes, then the condition becomes true. [ -f $file ] is true.
-g file Checks if file has its set group ID (SGID) bit set; if yes, then the condition becomes true. [ -g $file ] is false.
-k file Checks if file has its sticky bit set; if yes, then the condition becomes true. [ -k $file ] is false.
-p file Checks if file is a named pipe; if yes, then the condition becomes true. [ -p $file ] is false.
-t file Checks if file descriptor is open and associated with a terminal; if yes, then the condition becomes true. [ -t $file ] is false.
-u file Checks if file has its Set User ID (SUID) bit set; if yes, then the condition becomes true. [ -u $file ] is false.
-r file Checks if file is readable; if yes, then the condition becomes true. [ -r $file ] is true.
-w file Checks if file is writable; if yes, then the condition becomes true. [ -w $file ] is true.
-x file Checks if file is executable; if yes, then the condition becomes true. [ -x $file ] is true.
-s file Checks if file has size greater than 0; if yes, then condition becomes true. [ -s $file ] is true.
-e file Checks if file exists; is true even if file is a directory but exists. [ -e $file ] is true.

Cシェル演算子

次のリンクは、Cシェルオペレーターに関する簡単なアイデアを提供します-

リンク:/unix/unix-c-shell-operators [Cシェルオペレーター]

Korn Shellオペレーター

リンクをたどると、Korn Shell Operatorsを理解できます-

リンク:/unix/unix-korn-shell-operators [Korn Shell Operators]

Unix-シェルの意思決定

この章では、UNIXでのシェルの意思決定について理解します。 シェルスクリプトの作成中に、指定された2つのパスから1つのパスを採用する必要がある場合があります。 したがって、プログラムが正しい決定を下し、適切なアクションを実行できるようにする条件付きステートメントを使用する必要があります。

Unix Shellは、さまざまな条件に基づいてさまざまなアクションを実行するために使用される条件ステートメントをサポートしています。 ここで2つの意思決定ステートメントをここで理解します-

  • if …​ else ステートメント
  • case …​ esac ステートメント

if …​ elseステートメント

elseステートメントは、特定のオプションセットからオプションを選択するために使用できる有用な意思決定ステートメントです。

Unix Shellは、次の形式の if…else ステートメントをサポートしています-

  • リンク:/unix/if-fi-statement [if …​ fiステートメント]
  • リンク:/unix/if-else-statement [if …​ else …​ fiステートメント]
  • リンク:/unix/if-elif-statement [if …​ elif …​ else …​ fiステートメント]

ほとんどのifステートメントは、前の章で説明した関係演算子を使用して関係をチェックします。

case …​ esacステートメント

複数の if …​ elif ステートメントを使用して、多方向ブランチを実行できます。 ただし、これは、特にすべてのブランチが単一の変数の値に依存している場合は特に、常に最適なソリューションではありません。

Unix Shellは、この状況を正確に処理する case …​ esac ステートメントをサポートし、 if …​ elif ステートメントを繰り返すよりも効率的に処理します。

ここで詳細に説明されている case …​ esac ステートメントの形式は1つだけです-

  • リンク:/unix/case-esac-statement [case …​ esacステートメント]

Unixシェルの case …​ esac ステートメントは、 C または C ++ および PERL などの他のプログラミング言語にある switch …​ case ステートメントと非常によく似ています。

Unix-シェルループタイプ

この章では、Unixのシェルループについて説明します。 ループは、一連のコマンドを繰り返し実行できる強力なプログラミングツールです。 この章では、シェルプログラマーが利用できる次の種類のループを調べます。

  • リンク:/unix/while-loop [whileループ]
  • リンク:/unix/for-loop [forループ]
  • リンク:/unix/until-loop [untilループ]
  • リンク:/unix/select-loop [選択ループ]

状況に応じて異なるループを使用します。 たとえば、 while ループは、指定された条件が真になるまで、指定されたコマンドを実行します。 until ループは、特定の条件が真になるまで実行されます。

適切なプログラミングの練習ができたら、専門知識を習得し、状況に応じて適切なループを使用し始めます。 ここで、 while および for ループは、 CC ++PERL など、他のほとんどのプログラミング言語で使用できます。

入れ子ループ

すべてのループは入れ子の概念をサポートしているため、1つのループを別の類似のループまたは別のループ内に配置できます。 このネストは、要件に基づいて無制限の回数まで実行できます。

以下は while ループのネストの例です。 他のループは、同様の方法でプログラミング要件に基づいてネストすることができます-

whileループのネスト

whileループを別のwhileループの本体の一部として使用できます。

構文

while command1 ; # this is loop1, the outer loop
do
   Statement(s) to be executed if command1 is true

   while command2 ; # this is loop2, the inner loop
   do
      Statement(s) to be executed if command2 is true
   done

   Statement(s) to be executed if command1 is true
done

ループのネストの簡単な例を次に示します。 あなたが9にカウントするために使用したループ内に別のカウントダウンループを追加しましょう-

#!/bin/sh

a=0
while [ "$a" -lt 10 ]    # this is loop1
do
   b="$a"
   while [ "$b" -ge 0 ]  # this is loop2
   do
      echo -n "$b "
      b=`expr $b - 1`
   done
   echo
   a=`expr $a + 1`
done

これにより、次の結果が生成されます。 ここで echo -n がどのように機能するかに注意することが重要です。 ここで -n オプションを使用すると、エコーは改行文字を出力しません。

0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
5 4 3 2 1 0
6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

Unix-シェルループ制御

この章では、Unixでのシェルループ制御について説明します。 これまで、ループの作成とループを使用したさまざまなタスクの実行について見てきました。 ループを停止したり、ループの繰り返しをスキップしたりする必要がある場合があります。

この章では、シェルループの制御に使用される次の2つのステートメントについて学習します。

  • break ステートメント
  • continue ステートメント

無限ループ

すべてのループの寿命は制限されており、ループに応じて条件がfalseまたはtrueになると出力されます。

必要な条件が満たされない場合、ループは永遠に続く可能性があります。 終了せずに永久に実行されるループは、無限の回数実行されます。 このため、このようなループは無限ループと呼ばれます。

以下は、 while ループを使用して、0から9までの数字を表示する簡単な例です-

#!/bin/sh

a=10

until [ $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

このループは、 a が常に*より大きい*または 10 であり、10未満になることはないため、永遠に続きます。

breakステートメント

*break* ステートメントは、breakステートメントまでのすべてのコード行の実行を完了した後、ループ全体の実行を終了するために使用されます。 次に、ループの終わりに続くコードにステップダウンします。

構文

次の break ステートメントは、ループから抜け出すために使用されます-

break

ブレークコマンドは、この形式を使用してネストされたループを終了するために使用することもできます-

break n

ここで、 n は、出口へのループを囲む n ^ th ^ を指定します。

*a* が5になるとすぐにループが終了することを示す簡単な例を次に示します-
#!/bin/sh

a=0

while [ $a -lt 10 ]
do
   echo $a
   if [ $a -eq 5 ]
   then
      break
   fi
   a=`expr $a + 1`
done

実行すると、次の結果が表示されます-

0
1
2
3
4
5

ネストされたforループの簡単な例を次に示します。 var1が2 に等しく、 var2が0 に等しい場合、このスクリプトは両方のループから抜け出します-

#!/bin/sh

for var1 in 1 2 3
do
   for var2 in 0 5
   do
      if [ $var1 -eq 2 -a $var2 -eq 0 ]
      then
         break 2
      else
         echo "$var1 $var2"
      fi
   done
done

実行すると、次の結果が表示されます。 内側のループには、引数2を持つbreakコマンドがあります。 これは、条件が満たされた場合、外側のループから抜け出し、最終的には内側のループから抜け出す必要があることを示しています。

1 0
1 5

continueステートメント

*continue* ステートメントは *break* コマンドに似ていますが、ループ全体ではなく、ループの現在の反復を終了する点が異なります。

このステートメントは、エラーが発生したが、ループの次の反復を実行しようとする場合に役立ちます。

構文

continue

breakステートメントと同様に、整数引数をcontinueコマンドに指定して、ネストされたループからコマンドをスキップできます。

continue n

ここで、 n は、継続する n ^ th ^ を含むループを指定します。

次のループは、continueステートメントから戻り、次のステートメントの処理を開始する continue ステートメントを使用します-

#!/bin/sh

NUMS="1 2 3 4 5 6 7"

for NUM in $NUMS
do
   Q=`expr $NUM % 2`
   if [ $Q -eq 0 ]
   then
      echo "Number is an even number!!"
      continue
   fi
   echo "Found odd number"
done

実行すると、次の結果が表示されます-

Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number

Unix-シェル置換

置換とは何ですか?

シェルは、1つ以上の特殊文字を含む式を検出すると、置換を実行します。

ここでは、変数の印刷値がその値に置き換えられます。 同時に、 "\ n" は新しい行に置き換えられます-

#!/bin/sh

a=10
echo -e "Value of a is $a \n"

次の結果が表示されます。 ここで、*-e *オプションは、バックスラッシュエスケープの解釈を有効にします。

Value of a is 10

以下は -e オプションなしの結果です-

Value of a is 10\n

ここにエコーコマンドで使用できるエスケープシーケンスがあります-

Sr.No. Escape & Description
1

\\

バックスラッシュ

2

\a

アラート(BEL)

3

\b

バックスペース

4

\c

末尾の改行を抑制する

5

\f

フォームフィード

6

\n

改行

7

\r

キャリッジリターン

8

\t

水平タブ

9

\v

垂直タブ

*-E* オプションを使用して、バックスラッシュエスケープの解釈を無効にすることができます(デフォルト)。
*-n* オプションを使用して、新しい行の挿入を無効にすることができます。

コマンド置換

コマンド置換は、シェルが特定のコマンドセットを実行し、コマンドの代わりにそれらの出力を置換するメカニズムです。

構文

コマンドの置換は、コマンドが次のように指定されたときに実行されます-

`command`

コマンド置換を実行するときは、単一​​引用符ではなく逆引用符を使用してください。

コマンド置換は通常、コマンドの出力を変数に割り当てるために使用されます。 次の例のそれぞれは、コマンドの置換を示しています-

#!/bin/sh

DATE=`date`
echo "Date is $DATE"

USERS=`who | wc -l`
echo "Logged in user are $USERS"

UP=`date ; uptime`
echo "Uptime is $UP"

実行すると、次の結果が表示されます-

Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

可変置換

変数置換により、シェルプログラマーは、状態に基づいて変数の値を操作できます。

これはすべての可能な置換のための次の表です-

Sr.No. Form & Description
1

${var}

_var_の値を置き換えます。

2

$\{var:-word}

_var_がnullまたは未設定の場合、 var の代わりに_word_が使用されます。 _var_の値は変更されません。

3

$\{var:=word}

_var_がヌルまたは未設定の場合、_var_は word の値に設定されます。

4

$\{var:?message}

_var_がnullまたは未設定の場合、_message_は標準エラーに出力されます。 これにより、変数が正しく設定されていることが確認されます。

5

$\{var:PLUSword}

_var_が設定されている場合、_word_がvarに置き換えられます。 _var_の値は変更されません。

以下は、上記の置換のさまざまな状態を示す例です-

#!/bin/sh

echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"

echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"

unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"

var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"

echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

実行すると、次の結果が表示されます-

Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set

3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

Unix-シェルの引用メカニズム

この章では、シェルの引用メカニズムについて詳しく説明します。 メタキャラクターについて議論することから始めます。

メタキャラクター

Unix Shellは、シェルスクリプトで使用中に特別な意味を持つさまざまなメタキャラクターを提供し、引用されていない限り単語を終了させます。

たとえば、?*はディレクトリ内のファイルをリストするときに1文字と一致し、**は複数の文字と一致します。 これは、シェルの特殊文字(メタキャラクターとも呼ばれます)のほとんどのリストです-

* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab

文字の前に \ を付けることで、文字を引用することができます(つまり、文字自体を表すことができます)。

次の例は、**または?*を印刷する方法を示しています-

#!/bin/sh

echo Hello; Word

実行すると、次の結果が表示されます-

Hello
./test.sh: line 2: Word: command not found

shell returned 127

引用符で囲まれた文字を使用してみましょう-

#!/bin/sh

echo Hello\; Word

実行すると、次の結果が表示されます-

Hello; Word
*$* 記号はメタキャラクターの1つであるため、シェルによる特別な処理を避けるために引用符で囲む必要があります-
#!/bin/sh

echo "I have \$1200"

実行すると、次の結果が表示されます-

I have $1200

次の表は、引用の4つの形式を示しています-

Sr.No. Quoting & Description
1

Single quote

これらの引用符の間のすべての特殊文字は、その特別な意味を失います。

2

Double quote

これらの引用符の間のほとんどの特殊文字は、これらの例外で特別な意味を失います-

  • $
  • `
  • \$
  • \'
  • \" *\\
3
  • Backslash*

バックスラッシュの直後の文字は、特別な意味を失います。

4

Back quote

逆引用符の間にあるものはすべてコマンドとして扱われ、実行されます。

一重引用符

多くの特別なシェル文字を含むエコーコマンドを検討してください-

echo <-$1500.**>; (update?) [y|n]

各特殊文字の前にバックスラッシュを置くことは退屈であり、行を読みにくくします-

echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]

文字の大きなグループを引用する簡単な方法があります。 文字列の先頭と末尾に一重引用符( ')を入れます-

echo '<-$1500.**>; (update?) [y|n]'

一重引用符内の文字は、各文字の前にバックスラッシュがあるかのように引用されます。 これにより、echoコマンドは適切な方法で表示されます。

出力する文字列内に単一引用符が表示される場合は、文字列全体を単一引用符で囲むのではなく、次のように円記号(\)を使用してその前に置く必要があります-

echo 'It\'s Shell Programming

二重引用符

次のシェルスクリプトを実行してください。 このシェルスクリプトは一重引用符を使用します-

VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'

実行すると、次の結果が表示されます-

$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]

これは表示する必要があったものではありません。 単一引用符が変数の置換を妨げることは明らかです。 あなたが変数値を置き換え、逆コンマを期待どおりに動作させたい場合は、次のようにコマンドを二重引用符で囲む必要があります-

VAR=ZARA
echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"

実行すると、次の結果が表示されます-

ZARA owes <-$1500.**>; [ as of (07/02) ]

二重引用符は、以下を除くすべての文字の特別な意味を奪います-

  • $ パラメータ置換
  • コマンド置換の逆引用符
  • \ $ はリテラルドル記号を有効にします
  • * \ `*はリテラル逆引用符を有効にします
  • * \ "*は埋め込み二重引用符を有効にします
  • \\ 埋め込みバックスラッシュを有効にします
  • 他のすべての \ 文字はリテラルです(特別ではありません)

一重引用符内の文字は、各文字の前にバックスラッシュがあるかのように引用されます。 これにより、echoコマンドが正しく表示されます。

出力する文字列内に単一引用符が表示される場合は、文字列全体を単一引用符で囲むのではなく、次のように円記号(\)を使用してその前に置く必要があります-

echo 'It\'s Shell Programming'

バッククォート

*backquotes* の間にシェルコマンドを挿入すると、コマンドが実行されます。

構文

バッククォートの間に任意のシェル*コマンド*を配置するための簡単な構文は次のとおりです-

var=`command`

次の例では date コマンドが実行され、生成された結果はDATA変数に格納されます。

DATE=`date`

echo "Current Date: $DATE"

実行すると、次の結果が表示されます-

Current Date: Thu Jul  2 05:28:45 MST 2009

Unix-シェル入出力リダイレクト

この章では、シェルの入出力リダイレクトについて詳しく説明します。 ほとんどのUnixシステムコマンドは、端末から入力を受け取り、結果の出力を端末に送り返します。 通常、コマンドは標準入力から入力を読み取ります。標準入力はデフォルトで端末です。 同様に、コマンドは通常、その出力を標準出力に書き込みます。これもデフォルトでターミナルです。

出力のリダイレクト

通常は標準出力向けのコマンドからの出力は、代わりにファイルに簡単に転送できます。 この機能は、出力リダイレクトと呼ばれます。

通常、出力を標準出力に書き込むコマンドに表記法> fileが追加されている場合、そのコマンドの出力は端末ではなくファイルに書き込まれます。

usersファイル内のコマンドの完全な出力をリダイレクトする次の who コマンドを確認してください。

$ who > users

ターミナルに出力が表示されないことに注意してください。 これは、出力がデフォルトの標準出力デバイス(ターミナル)から指定されたファイルにリダイレクトされたためです。 あなたは完全なコンテンツのユーザーファイルを確認することができます-

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

コマンドの出力がファイルにリダイレクトされ、ファイルにすでにデータが含まれている場合、そのデータは失われます。 次の例を考慮してください-

$ echo line 1 > users
$ cat users
line 1
$

次のように>>演算子を使用して、既存のファイルに出力を追加できます-

$ echo line 2 >> users
$ cat users
line 1
line 2
$

入力リダイレクト

コマンドの出力をファイルにリダイレクトできるように、コマンドの入力もファイルからリダイレクトできます。 *より大きい文字> *は出力のリダイレクトに使用されるため、*より小さい文字<*はコマンドの入力をリダイレクトするために使用されます。

通常、標準入力から入力を受け取るコマンドは、この方法で入力をファイルからリダイレクトできます。 たとえば、上記で生成されたファイル_users_の行数をカウントするには、次のようにコマンドを実行できます-

$ wc -l users
2 users
$

実行すると、次の出力が表示されます。 ファイル_users_から wc コマンドの標準入力をリダイレクトすることにより、ファイルの行数をカウントできます-

$ wc -l < users
2
$

wcコマンドの2つの形式によって生成される出力には違いがあることに注意してください。 最初のケースでは、ファイルユーザーの名前が行数とともにリストされます。 2番目のケースでは、そうではありません。

前者の場合、wcはファイルユーザーから入力を読み取っていることを認識しています。 2番目のケースでは、ファイル名を表示しないため、標準入力から入力を読み取っていることがわかっているだけです。

ヒアドキュメント

  • hereドキュメント*は、対話型のシェルスクリプトまたはプログラムに入力をリダイレクトするために使用されます。

対話型プログラムまたは対話型シェルスクリプトに必要な入力を提供することにより、ユーザーの操作なしでシェルスクリプト内で対話型プログラムを実行できます。

  • ここ*ドキュメントの一般的な形式は-
command << delimiter
document
delimiter

ここで、シェルは << 演算子を、指定された区切り文字を含む行が見つかるまで入力を読み取る命令として解釈します。 区切り文字を含む行までのすべての入力行は、コマンドの標準入力に送られます。

区切り文字は、シェルに here ドキュメントが完了したことを伝えます。 これがないと、シェルは入力を永久に読み取り続けます。 区切り文字は、スペースまたはタブを含まない単一の単語でなければなりません。

以下は、行の総数を数えるコマンド wc -l への入力です-

$wc -l << EOF
   This is a simple lookup program
    for good (and bad) restaurants
    in Cape Town.
EOF
3
$

次のようにスクリプトを使用して複数の行を印刷するには、* hereドキュメント*を使用できます-

#!/bin/sh

cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF

実行すると、次の結果が表示されます-

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

次のスクリプトは、 vi テキストエディターでセッションを実行し、入力をファイル test.txt に保存します。

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

vimとして機能するvimでこのスクリプトを実行すると、次のような出力が表示される可能性があります-

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

スクリプトを実行した後、ファイル test.txt に次の内容が追加されます-

$ cat test.txt
This file was created automatically from
a shell script
$

出力を破棄する

コマンドを実行する必要がある場合もありますが、出力を画面に表示したくない場合があります。 このような場合、ファイル /dev/null にリダイレクトすることで出力を破棄できます-

$ command >/dev/null

ここで、commandは実行するコマンドの名前です。 ファイル /dev/null は、すべての入力を自動的に破棄する特別なファイルです。

コマンドの出力とそのエラー出力の両方を破棄するには、標準リダイレクトを使用して STDERRSTDOUT にリダイレクトします-

$ command >/dev/null 2>&1

ここで、 2STDERR を表し、 1STDOUT を表します。 次のようにSTDOUTをSTDERRにリダイレクトすることにより、STDERRにメッセージを表示できます-

$ echo message 1>&2

リダイレクトコマンド

以下は、リダイレクトに使用できるコマンドの完全なリストです-

Sr.No. Command & Description
1

pgm > file

pgmの出力はファイルにリダイレクトされます

2

pgm < file

プログラムpgmはファイルから入力を読み取ります

3

pgm >> file

pgmの出力はファイルに追加されます

4

n > file

ファイルにリダイレクトされた記述子 n を持つストリームからの出力

5

n >> file

ファイルに記述子 n が追加されたストリームからの出力

6

n >& m

ストリーム n からの出力をストリーム m にマージします

7

n <& m

ストリーム n からの入力をストリーム m にマージします

8

<< tag

標準入力は、ここから行頭の次のタグを介して取得されます

9

VERBAR

あるプログラムまたはプロセスから出力を取得し、別のプログラムまたはプロセスに送信します

ファイル記述子 0 は通常標準入力(STDIN)、 1 は標準出力(STDOUT)、および 2 は標準エラー出力(STDERR)であることに注意してください。

Unix-シェル関数

この章では、シェル関数について詳しく説明します。 関数を使用すると、スクリプトの全体的な機能をより小さく論理的なサブセクションに分割し、必要に応じて個々のタスクを実行するために呼び出すことができます。

関数を使用して反復タスクを実行することは、*コードの再利用*を作成する優れた方法です。 これは、現代のオブジェクト指向プログラミングの原則の重要な部分です。

シェル関数は、他のプログラミング言語のサブルーチン、プロシージャ、および関数に似ています。

関数を作成する

関数を宣言するには、単に次の構文を使用します-

function_name () {
   list of commands
}

関数の名前は function_name であり、スクリプト内の別の場所から呼び出すために使用します。 関数名の後には括弧が続き、その後に中括弧で囲まれたコマンドのリストが続く必要があります。

次の例は、関数の使用を示しています-

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World"
}

# Invoke your function
Hello

実行すると、次の出力が表示されます-

$./test.sh
Hello World

関数にパラメーターを渡す

関数の呼び出し中にパラメーターを受け入れる関数を定義できます。 これらのパラメーターは、 $ 1$ 2 などで表されます。

以下に、2つのパラメーター_Zara_および_Ali_を渡し、関数でこれらのパラメーターをキャプチャして出力する例を示します。

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
}

# Invoke your function
Hello Zara Ali

実行すると、次の結果が表示されます-

$./test.sh
Hello World Zara Ali

関数から値を返す

関数内から exit コマンドを実行すると、関数の実行を終了するだけでなく、関数を呼び出したシェルプログラムも終了します。

代わりに関数の実行を単に終了したい場合は、定義済みの関数から抜け出す方法があります。

状況に基づいて、次のような構文を持つ return コマンドを使用して、関数から任意の値を返すことができます-

return code

ここで code はここで選択したものであれば何でも構いませんが、スクリプト全体として意味のある、または有用なものを選択する必要があります。

次の関数は値10を返します-

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}

# Invoke your function
Hello Zara Ali

# Capture value returnd by last command
ret=$?

echo "Return value is $ret"

実行すると、次の結果が表示されます-

$./test.sh
Hello World Zara Ali
Return value is 10

入れ子関数

関数のより興味深い機能の1つは、関数自体と他の関数を呼び出すことができることです。 自分自身を呼び出す関数は、 _ recursive function_ と呼ばれます。

次の例は、2つの関数のネストを示しています-

#!/bin/sh

# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}

number_two () {
   echo "This is now the second function speaking..."
}

# Calling function one.
number_one

実行すると、次の結果が表示されます-

This is the first function speaking...
This is now the second function speaking...

プロンプトからの関数呼び出し

*_。profile_* 内に一般的に使用される関数の定義を配置できます。 これらの定義は、ログインするたびに使用可能になり、コマンドプロンプトで使用できます。

または、 _ test.sh_ などのファイル内の定義をグループ化し、次に入力して現在のシェルでファイルを実行できます-

$. test.sh

これは、 _ test.sh_ 内で定義された関数を読み取り、次のように現在のシェルに定義する効果があります-

$ number_one
This is the first function speaking...
This is now the second function speaking...
$

シェルから関数の定義を削除するには、*。f *オプションを指定してunsetコマンドを使用します。 このコマンドは、シェルの変数の定義を削除するためにも使用されます。

$ unset -f function_name

Unix-シェルマンページヘルプ

すべてのUnixコマンドには、いくつかのオプションと必須のオプションがあります。 これらのコマンドの完全な構文を忘れることは非常に一般的です。

すべてのUnixコマンドとそのオプションを誰も覚えていない可能性があるため、Unixが開発段階にあったときからこの権利を軽減するためのオンラインヘルプが用意されています。

Unixの* Helpファイル*のバージョンは* manページ*と呼ばれます。 コマンド名があり、その使用方法がわからない場合は、マニュアルページですべての手順を実行できます。

構文

これは、システムを操作しながらUnixコマンドの詳細を取得するのに役立つ簡単なコマンドです-

$man command

ヘルプが必要なコマンドがあるとします。あなたが pwd について知りたいと仮定すると、単に次のコマンドを使用する必要があります-

$man pwd

上記のコマンドは、 pwd コマンドに関する完全な情報に役立ちます。 コマンドプロンプトで自分で試して、詳細を確認してください。

次のコマンドを使用して、 man コマンド自体の詳細を取得できます-

$man man

マニュアルページセクション

マニュアルページは一般にセクションに分割され、一般にマニュアルページの作成者の好みによって異なります。 次の表は、いくつかの一般的なセクションを示しています-

Sr.No. Section & Description
1

NAME

コマンドの名前

2

SYNOPSIS

コマンドの一般的な使用パラメーター

3

DESCRIPTION

コマンドの動作を説明します

4

OPTIONS

コマンドのすべての引数またはオプションを説明します

5

SEE ALSO

manページのコマンドに直接関連する、またはその機能によく似ている他のコマンドをリストします

6

BUGS

コマンドまたはその出力に存在する既知の問題またはバグを説明します

7

EXAMPLES

コマンドの使用方法を読者に説明する一般的な使用例

8

AUTHORS

マニュアルページ/コマンドの作成者

要約すると、manページは重要なリソースであり、Unixシステムのコマンドまたはファイルに関する情報が必要な場合の最初の調査手段です。

便利なシェルコマンド

次のリンクは、最も重要で頻繁に使用されるUnixシェルコマンドのリストを提供します。

コマンドの使用方法がわからない場合は、マニュアルページを使用してコマンドの詳細を確認してください。

リンクのリストは次のとおりです:/unix/unix-useful-commands [Unix Shell-Useful Commands]

Unix-SEDを使用した正規表現

この章では、UnixのSEDを使用した正規表現について詳しく説明します。

正規表現は、複数の文字シーケンスを記述するために使用できる文字列です。 正規表現は、 edsedawkgrep 、さらに限定された範囲の vi など、さまざまなUnixコマンドで使用されます。

ここで、 SED は* s tream ed * itorを表します。 このストリーム指向のエディターは、スクリプトの実行専用に作成されました。 したがって、そこに入力するすべての入力は通過してSTDOUTに送られ、入力ファイルは変更されません。

sedの呼び出し

開始する前に、 sed で動作する /etc/passwd テキストファイルのローカルコピーがあることを確認してください。

前述のように、sedは次のようにパイプを介してデータを送信することで呼び出すことができます-

$ cat/etc/passwd | sed
Usage: sed [OPTION]... {script-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression = script
...............................
*cat* コマンドは、パイプを介して */etc/passwd* の内容を *sed* にダンプし、sedのパターンスペースに入れます。 パターン空間は、sedがその操作に使用する内部作業バッファーです。

sedの一般的な構文

sedの一般的な構文は次のとおりです-

/pattern/action

ここで、 pattern は正規表現であり、 action は次の表に示すコマンドの1つです。 pattern が省略された場合、上で見たように action がすべての行に対して実行されます。

パターンを囲むスラッシュ文字(/)は、区切り文字として使用されるため必要です。

Sr.No. Range & Description
1

p

行を印刷します

2

d

行を削除します

3

s/pattern1/pattern2/

pattern1の最初の出現をpattern2に置き換えます

sedを使用してすべての行を削除する

これで、sedを使用してすべての行を削除する方法を理解できます。 sedを再度呼び出します。しかし、sedは現在、単一の文字 d で示される editingコマンドdelete line を使用することになっています-

$ cat/etc/passwd | sed 'd'
$

次の例のように、パイプを介してファイルを送信してsedを呼び出す代わりに、sedにファイルからデータを読み取るように指示することができます。

次のコマンドは、catコマンドなしで、前の例とまったく同じことを行います-

$ sed -e 'd'/etc/passwd
$

sedアドレス

sedはアドレスもサポートしています。 アドレスは、ファイル内の特定の場所、または特定の編集コマンドを適用する範囲です。 sedはアドレスを検出しないと、ファイル内のすべての行で操作を実行します。

次のコマンドは、使用しているsedコマンドに基本アドレスを追加します-

$ cat/etc/passwd | sed '1d' |more
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$
*delete edit* コマンドの前に番号1が追加されていることに注意してください。 これは、ファイルの最初の行で編集コマンドを実行するようにsedに指示します。 この例では、sedは */etc/password* の最初の行を削除し、ファイルの残りを印刷します。

sedアドレス範囲

これで、* sedアドレス範囲*の操作方法を理解できます。 では、ファイルから複数の行を削除したい場合はどうでしょうか? 次のようにsedでアドレス範囲を指定できます-

$ cat/etc/passwd | sed '1, 5d' |more
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

上記のコマンドは、1から5までのすべての行に適用されます。 これにより、最初の5行が削除されます。

次のアドレス範囲を試してください-

Sr.No. Range & Description
1

'4,10d'

4番目から10番目までの行は削除されます

2

'10,4d'

sedは逆方向に機能しないため、10 ^ th ^行のみが削除されます

3

'4,PLUS5d'

これはファイルの4行目と一致し、その行を削除し、次の5行を削除し続け、削除を中止して残りを出力します

4

'2,5!d'

これは、2 ^ nd ^から5 ^ th ^行までを除くすべてを削除します

5

'1~3d'

これにより、最初の行が削除され、次の3行がステップオーバーされ、4行目が削除されます。 Sedは、ファイルの終わりまでこのパターンを適用し続けます。

6

'2~2d'

これにより、sedは2行目を削除し、次の行をステップオーバーし、次の行を削除し、ファイルの終わりに達するまで繰り返します。

7

'4,10p'

4 ^ th ^から10 ^ th ^までの行が印刷されます

8

'4,d'

これにより、構文エラーが生成されます

9

',10d'

これも構文エラーを生成します

注意- p アクションを使用しているときは、*-n *オプションを使用して、行の印刷が繰り返されないようにする必要があります。 次の2つのコマンドの違いを確認してください-

$ cat/etc/passwd | sed -n '1,3p'
Check the above command without -n as follows −
$ cat/etc/passwd | sed '1,3p'

置換コマンド

*s* で示される置換コマンドは、指定した文字列を指定した他の文字列で置換します。

ある文字列を別の文字列に置き換えるには、sedに最初の文字列が終了し、置換文字列が始まる場所に関する情報が必要です。 このため、2つの文字列をスラッシュ( / )文字でブックエンドします。

次のコマンドは、文字列 root の行で最初に出現するものを文字列 amrood に置き換えます。

$ cat/etc/passwd | sed 's/root/amrood/'
amrood:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
..........................

sedは行の最初の出現のみを置換することに注意することが非常に重要です。 文字列ルートが1行に複数回出現する場合、最初に一致したものだけが置き換えられます。

sedがグローバル置換を実行するには、次のようにコマンドの末尾に文字 g を追加します-

$ cat/etc/passwd | sed 's/root/amrood/g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
...........................

置換フラグ

*g* フラグに加えて渡すことができるその他の便利なフラグがいくつかあり、一度に複数のフラグを指定できます。
Sr.No. Flag & Description
1

g

最初の一致だけでなく、すべての一致を置き換えます

2

NUMBER

NUMBER ^ th ^マッチのみを置換します

3

p

置換が行われた場合、パターンスペースを出力します

4

w FILENAME

置換が行われた場合、結果をFILENAMEに書き込みます

5

I or i

大文字と小文字を区別しない方法で一致

6

M or m

特殊な正規表現文字および$の通常の動作に加えて、このフラグにより​​、は改行の後の空の文字列に一致し、$は改行の前の空の文字列に一致します

代替文字列セパレーターの使用

スラッシュ文字を含む文字列を置換する必要があるとします。 この場合、 s の後に指定された文字を指定することにより、異なるセパレーターを指定できます。

$ cat/etc/passwd | sed 's:/root:/amrood:g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

上記の例では、単純なルートではなく /root を検索しようとしたため、スラッシュ:の代わりに*:を *delimiter として使用しました。

空のスペースで置き換える

空の置換文字列を使用して、ルート文字列を /etc/passwd ファイルから完全に削除します-

$ cat/etc/passwd | sed 's/root//g'
:x:0:0::/:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

アドレス置換

あなたが文字列 sh を文字列 quiet で10行目のみで置換したい場合は、次のように指定できます-

$ cat/etc/passwd | sed '10s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/quiet

同様に、アドレス範囲の置換を行うには、次のようなことを行うことができます-

$ cat/etc/passwd | sed '1,5s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/quiet
daemon:x:1:1:daemon:/usr/sbin:/bin/quiet
bin:x:2:2:bin:/bin:/bin/quiet
sys:x:3:3:sys:/dev:/bin/quiet
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

出力からわかるように、最初の5行では文字列 shquiet に変更されましたが、残りの行は変更されていません。

マッチングコマンド

あなたは、次のようにすべての一致する行を印刷する*-n オプションと一緒に *p オプションを使用します-

$ cat testing | sed -n '/root/p'
root:x:0:0:root user:/root:/bin/sh
[root@ip-72-167-112-17 amrood]# vi testing
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

正規表現を使用する

パターンの照合中に、より柔軟な正規表現を使用できます。

_daemon_で始まるすべての行に一致し、それらを削除する次の例を確認してください-

$ cat testing | sed '/^daemon/d'
root:x:0:0:root user:/root:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

以下は、 sh で終わるすべての行を削除する例です-

$ cat testing | sed '/sh$/d'
sync:x:4:65534:sync:/bin:/bin/sync

次の表に、正規表現で非常に役立つ4つの特殊文字を示します。

Sr.No. Character & Description
1

^

行頭と一致します

2

$

行末に一致します

3

.

任意の1文字と一致します

4 前の文字のゼロ回以上の出現に一致します
5

[chars]

charsで指定された文字のいずれかに一致します。charsは文字のシーケンスです。 文字の範囲を示すために-文字を使用できます。

一致する文字

  • メタ文字*の使用を示すために、さらにいくつかの式を見てください。 たとえば、次のパターン-
Sr.No. Expression & Description
1

/a.c/

  • a&plus; c* 、 *a-c* 、 *abc* 、 *match* 、 *a3c* などの文字列を含む行に一致します
2

/a*c/

  • ace* 、 *yacc* 、 *arctic* などの文字列と同じ文字列に一致します
3

/[tT]he/

ストリング The および the に一致します

4

/^$/

空白行に一致

5

/^.$/*

行全体に一致します

6

//*

1つ以上のスペースに一致

7

/^$/

  • 空白*行に一致

次の表は、頻繁に使用される文字セットを示しています-

Sr.No. Set & Description
1

[a-z]

単一の小文字と一致します

2

[A-Z]

単一の大文字と一致します

3

[a-zA-Z]

単一の文字と一致します

4

[0-9]

単一の数字と一致します

5

[a-zA-Z0-9]

単一の文字または数字と一致します

文字クラスのキーワード

いくつかの特別なキーワード、特に regexps を使用するGNUユーティリティは、一般的に regexps で利用できます。 これらは物事を簡素化し、読みやすさを高めるため、sed正規表現に非常に役立ちます。

たとえば、文字 aからz および文字 AからZ は、キーワード :alpha: を持つ文字の1つのクラスを構成します。

アルファベット文字クラスキーワードを使用して、このコマンドは、アルファベットの文字で始まる /etc/syslog.conf ファイル内の行のみを印刷します-

$ cat/etc/syslog.conf | sed -n '/^[[:alpha:]]/p'
authpriv.*                        /var/log/secure
mail.*                             -/var/log/maillog
cron.*                            /var/log/cron
uucp,news.crit                    /var/log/spooler
local7. */var/log/boot.log

次の表は、GNU sedで使用可能な文字クラスキーワードの完全なリストです。

Sr.No. Character Class & Description
1
  • *

英数字[a-z A-Z 0-9]

2

'

アルファベット[a-z A-Z]

3

'

空白文字(スペースまたはタブ)

4

'

制御文字

5

'

数字[0-9]

6

'

可視文字(空白を除く)

7

'

小文字[a-z]

8

'

印刷可能文字(非制御文字)

9

'

句読文字

10

'

空白

11

'

大文字[A-Z]

12

'

16進数[0-9 a-f A-F]

アンパサンド参照

  • sedメタ文字&は、一致したパターンの内容を表します。 たとえば、次のような電話番号でいっぱいの *phone.txt というファイルがあるとします-
5555551212
5555551213
5555551214
6665551215
6665551216
7775551217

読みやすいように、括弧で囲まれた*市外局番*(最初の3桁)を作成します。 これを行うには、アンパサンド置換文字を使用できます-

$ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt
(555)5551212
(555)5551213
(555)5551214
(666)5551215

(666)5551216
(777)5551217

ここで、パターン部分では、最初の3桁を照合し、*&*を使用して、これらの3桁を周囲の*括弧*に置き換えています。

複数のsedコマンドの使用

次のように、単一のsedコマンドで複数のsedコマンドを使用できます-

$ sed -e 'command1' -e 'command2' ... -e 'commandN' files

ここで、 command1 から commandN は、前述のタイプのsedコマンドです。 これらのコマンドは、filesによって指定されたファイルのリスト内の各行に適用されます。

同じメカニズムを使用して、次のように上記の電話番号の例を書くことができます-

$ sed -e 's/^[[:digit:]]\{3\}/(&)/g'  \
   -e 's/)[[:digit:]]\{3\}/&-/g' phone.txt
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

-上記の例では、文字クラスのキーワード :digit: を3回繰り返す代わりに、 \\ {3 \} に置き換えました。つまり、前の正規表現が3回。 また、改行を使用するために \ を使用しましたが、これはコマンドを実行する前に削除する必要があります。

バックリファレンス

  • アンパサンドメタ文字*は便利ですが、さらに便利なのは、正規表現で特定の領域を定義できることです。 これらの特別な領域は、置換文字列の参照として使用できます。 正規表現の特定の部分を定義することにより、特別な参照文字を使用してそれらの部分を参照できます。

逆参照*を行うには、最初に領域を定義してから、その領域を参照し直す必要があります。 領域を定義するには、対象の各領域の周りに*バックスラッシュ付き括弧*を挿入します。 バックスラッシュで囲む最初の領域は *\ 1 で参照され、2番目の領域は \ 2 で参照されます。

*phone.txt* には次のテキストがあると仮定します-
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

次のコマンドを試してください-

$ cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area \
   code: \1 Second: \2 Third: \3/'
Area code: (555) Second: 555- Third: 1212
Area code: (555) Second: 555- Third: 1213
Area code: (555) Second: 555- Third: 1214
Area code: (666) Second: 555- Third: 1215
Area code: (666) Second: 555- Third: 1216
Area code: (777) Second: 555- Third: 1217

注意-上記の例では、括弧内の各正規表現は \ 1\ 2 などによって後方参照されます。 ここで改行するために \ を使用しました。 これは、コマンドを実行する前に削除する必要があります。

Unix-ファイルシステムの基本

ファイルシステムは、パーティションまたはディスク上のファイルの論理的な集合です。 パーティションは情報のコンテナであり、必要に応じてハードドライブ全体にまたがることができます。

ハードドライブには、 /file system を格納するファイルシステムや*/homeファイルシステム*を格納するファイルシステムなど、通常1つのファイルシステムのみを含むさまざまなパーティションを作成できます。

パーティションごとに1つのファイルシステムを使用すると、異なるファイルシステムの論理的なメンテナンスと管理が可能になります。

UNIXのすべては、DVD-ROM、USBデバイス、フロッピードライブなどの物理デバイスを含むファイルと見なされます。

ディレクトリ構造

Unixは、逆さまのツリーによく似た階層的なファイルシステム構造を使用し、ファイルシステムのベースにルート(/)があり、そこから他のすべてのディレクトリが広がっています。

Unixファイルシステムは、次のプロパティを持つファイルとディレクトリのコレクションです-

  • 他のファイルとディレクトリを含むルートディレクトリ( / )があります。
  • 各ファイルまたはディレクトリは、その名前、存在するディレクトリ、および通常 inode と呼ばれる一意の識別子によって一意に識別されます。
  • 慣例により、ルートディレクトリには 2inode 番号があり、 lost&plus; found ディレクトリには 3inode 番号があります。 iノード番号 0 および 1 は使用されません。 ファイルのiノード番号は、* lsコマンド*に* -iオプション*を指定することで確認できます。 *自己完結型です。 あるファイルシステムと別のファイルシステムの間に依存関係はありません。

ディレクトリには特定の目的があり、一般にファイルを簡単に見つけるために同じタイプの情報を保持します。 Unixのメジャーバージョンに存在するディレクトリは次のとおりです-

Sr.No. Directory & Description
1

/

これは、ファイル構造の最上位で必要なディレクトリのみを含むルートディレクトリです。

2

/bin

これは、実行可能ファイルが置かれている場所です。 これらのファイルはすべてのユーザーが利用できます

3

/dev

これらはデバイスドライバーです

4

/etc

スーパーバイザディレクトリコマンド、構成ファイル、ディスク構成ファイル、有効なユーザーリスト、グループ、イーサネット、ホスト、重要なメッセージの送信先

5

/lib

共有ライブラリファイルと、場合によっては他のカーネル関連ファイルが含まれます

6

/boot

システムを起動するためのファイルが含まれています

7

/home

ユーザーおよびその他のアカウントのホームディレクトリが含まれています

8

/mnt

  • CD-ROM* ドライブと*フロッピーディスケットドライブ*の *cdrom* と *floppy* など、他の一時ファイルシステムをそれぞれマウントするために使用
9

/proc

  • プロセス番号*またはシステムにとって動的な他の情報によってファイルとしてマークされたすべてのプロセスが含まれます
10

/tmp

システムのブート間で使用される一時ファイルを保持します

11

/usr

その他の目的で使用され、多くのユーザーが使用できます。 管理コマンド、共有ファイル、ライブラリファイルなどが含まれます

12

/var

通常、ログファイルや印刷ファイルなどの可変長ファイルと、可変量のデータを含む可能性があるその他の種類のファイルが含まれます。

13

/sbin

通常はシステム管理用のバイナリ(実行可能)ファイルが含まれます。 たとえば、 _ fdisk_ および ifconfig utlities

14

/kernel

カーネルファイルが含まれています

ファイルシステムのナビゲート

ファイルシステムの基本を理解したので、必要なファイルへのナビゲートを開始できます。 次のコマンドは、システムをナビゲートするために使用されます-

Sr.No. Command & Description
1

cat filename

ファイル名を表示します

2

cd dirname

指定されたディレクトリに移動します

3

cp file1 file2

1つのファイル/ディレクトリを指定された場所にコピーします

4

file filename

ファイルの種類(バイナリ、テキストなど)を識別します

5

find filename dir

ファイル/ディレクトリを見つける

6

head filename

ファイルの始まりを示します

7

less filename

ファイルを末尾または先頭から閲覧します

8

ls dirname

指定されたディレクトリの内容を表示します

9

mkdir dirname

指定されたディレクトリを作成します

10

more filename

ファイルを最初から最後まで閲覧します

11

mv file1 file2

ファイル/ディレクトリの場所を移動するか、ファイル/ディレクトリの名前を変更します

12

pwd

ユーザーが現在いるディレクトリを表示します

13

rm filename

ファイルを削除します

14

rmdir dirname

ディレクトリを削除します

15

tail filename

ファイルの終わりを示します

16

touch filename

空のファイルを作成するか、既存のファイルまたはその属性を変更します

17

whereis filename

ファイルの場所を表示します

18

which filename

PATHにあるファイルの場所を表示します

link:/unix/unix-manpage-help [Manpage Help]を使用して、ここで説明する各コマンドの完全な構文を確認できます。

dfコマンド

パーティションスペースを管理する最初の方法は、* df(ディスクフリー)コマンドを使用することです。 コマンド df -k(ディスク空き)*は、以下に示すように、*ディスク領域の使用量をキロバイト*で表示します-

$df -k
Filesystem      1K-blocks      Used   Available Use% Mounted on
/dev/vzfs        10485760   7836644     2649116  75%/
/devices                0         0           0   0%/devices
$
*/devices* などの一部のディレクトリでは、kbytes、used、およびavail列に0が表示され、容量が0%になります。 これらは特別な(または仮想の)ファイルシステムであり、/の下のディスクに存在しますが、それ自体はディスクスペースを消費しません。
*df -k* 出力は、一般にすべてのUnixシステムで同じです。 これは通常含まれるものです-
Sr.No. Column & Description
1

Filesystem

物理ファイルシステム名

2

kbytes

記憶媒体で使用可能なスペースの合計キロバイト

3

used

使用されたスペースの合計キロバイト(ファイルごと)

4

avail

使用可能な合計キロバイト

5

capacity

ファイルが使用する合計スペースの割合

6

Mounted on

ファイルシステムがマウントされているもの

  • -h(人間が読める)オプション*を使用して、サイズをわかりやすい表記で表示する形式で出力を表示できます。

デュコマンド

  • du(ディスク使用量)コマンド*を使用すると、ディレクトリを指定して、特定のディレクトリのディスクスペース使用量を表示できます。

このコマンドは、特定のディレクトリが使用しているスペースを特定する場合に役立ちます。 次のコマンドは、各ディレクトリが消費するブロック数を表示します。 単一のブロックは、システムに応じて512バイトまたは1キロバイトのいずれかを使用する場合があります。

$du/etc
10    /etc/cron.d
126   /etc/default
6     /etc/dfs
...
$
*-h* オプションにより、出力が理解しやすくなります-
$du -h/etc
5k   /etc/cron.d
63k  /etc/default
3k   /etc/dfs
...
$

ファイルシステムのマウント

システムが使用できるようにするには、ファイルシステムをマウントする必要があります。 システムに現在マウントされている(使用可能な)ものを確認するには、次のコマンドを使用します-

$ mount
/dev/vzfs on/type reiserfs (rw,usrquota,grpquota)
proc on/proc type proc (rw,nodiratime)
devpts on/dev/pts type devpts (rw)
$

Unixの慣例により、 /mnt ディレクトリは、一時的なマウント(CDROMドライブ、リモートネットワークドライブ、フロッピードライブなど)が置かれる場所です。 あなたがファイルシステムをマウントする必要がある場合は、次の構文でマウントコマンドを使用することができます-

mount -t file_system_type device_to_mount directory_to_mount_to

たとえば、 CD-ROM をディレクトリ /mnt/cdrom にマウントする場合は、次のように入力できます-

$ mount -t iso9660/dev/cdrom/mnt/cdrom

これは、CD-ROMデバイスの名前が /dev/cdrom であり、 /mnt/cdrom にマウントすることを前提としています。 より具体的な情報についてはmountのmanページを参照するか、ヘルプ情報についてはコマンドラインでmount -h と入力してください。

マウントした後、cdコマンドを使用して、作成したマウントポイントを介して新しく利用可能なファイルシステムをナビゲートできます。

ファイルシステムのアンマウント

システムからファイルシステムをアンマウント(削除)するには、マウントポイントまたはデバイスを特定して umount コマンドを使用します。

たとえば、CDROMをアンマウントするには*、次のコマンドを使用します-

$ umount/dev/cdrom
  • mountコマンド*を使用すると、ファイルシステムにアクセスできますが、最新のUnixシステムのほとんどでは、* automount関数*により、このプロセスがユーザーに見えなくなり、介入は不要です。

ユーザーとグループのクォータ

ユーザーおよびグループのクォータは、特定のグループ内の単一のユーザーまたはすべてのユーザーが使用するスペースの量を、管理者が定義した値に制限できるメカニズムを提供します。

クォータは、スペースの量またはディスクブロックの数が管理者が定義した制限を超え始めた場合にユーザーが何らかのアクションを取ることができる2つの制限を中心に動作します-

  • ソフト制限-ユーザーが定義された制限を超えた場合、ユーザーがスペースを解放できる猶予期間があります。
  • ハード制限-猶予期間に関係なく、ハード制限に達すると、それ以上ファイルまたはブロックを割り当てることができません。

クォータを管理するためのコマンドがいくつかあります-

Sr.No. Command & Description
1

quota

グループのユーザーのディスク使用量と制限を表示します

2

edquota

これはクォータエディターです。 ユーザーまたはグループのクォータは、このコマンドを使用して編集できます

3

quotacheck

ディスク使用状況についてファイルシステムをスキャンし、クォータファイルを作成、確認、修復します

4

setquota

これはコマンドラインクォータエディターです

5

quotaon

これにより、1つ以上のファイルシステムでディスククォータを有効にする必要があることがシステムに通知されます。

6

quotaoff

これにより、1つ以上のファイルシステムのディスククォータを無効にする必要があることがシステムに通知されます。

7

repquota

これにより、指定したファイルシステムのディスク使用量とクォータの概要が出力されます

link:/unix/unix-manpage-help [Manpage Help]を使用して、ここで説明する各コマンドの完全な構文を確認できます。

Unix-ユーザー管理

この章では、Unixでのユーザー管理について詳しく説明します。

Unixシステムには3種類のアカウントがあります-

ルートアカウント

これは「スーパーユーザー」とも呼ばれ、システムを完全かつ自由に制御できます。 スーパーユーザーは、制限なくコマンドを実行できます。 このユーザーは、システム管理者として想定される必要があります。

システムアカウント

システムアカウントは、たとえばメールアカウントや sshd アカウントなど、システム固有のコンポーネントの操作に必要なアカウントです。 通常、これらのアカウントはシステム上の特定の機能に必要であり、それらの変更はシステムに悪影響を与える可能性があります。

ユーザーアカウント

ユーザーアカウントは、ユーザーおよびユーザーグループにシステムへの対話型アクセスを提供します。 通常、一般ユーザーはこれらのアカウントに割り当てられ、通常、重要なシステムファイルおよびディレクトリへのアクセスが制限されています。

Unixは、多数のアカウントを論理的にグループ化する_Group Account_の概念をサポートしています。 すべてのアカウントは、別のグループアカウントの一部になります。 Unixグループは、ファイルのアクセス許可とプロセス管理で重要な役割を果たします。

ユーザーとグループの管理

4つの主なユーザー管理ファイルがあります-

  • /etc/passwd -ユーザーアカウントとパスワード情報を保持します。 このファイルには、Unixシステム上のアカウントに関する情報の大部分が含まれています。

  • /etc/shadow -対応するアカウントの暗号化されたパスワードを保持します。 すべてのシステムがこのファイルをサポートしているわけではありません。

  • /etc/group -このファイルには、各アカウントのグループ情報が含まれています。

  • /etc/gshadow -このファイルには、安全なグループアカウント情報が含まれています。

    *cat* コマンドを使用して、上記のすべてのファイルを確認します。

次の表は、アカウントとグループを作成および管理するために、ほとんどのUnixシステムで使用できるコマンドを示しています-

Sr.No. Command & Description
1

useradd

システムにアカウントを追加します

2

usermod

アカウント属性を変更します

3

userdel

システムからアカウントを削除します

4

groupadd

システムにグループを追加します

5

groupmod

グループ属性を変更します

6

groupdel

システムからグループを削除します

link:/unix/unix-manpage-help [Manpage Help]を使用して、ここで説明する各コマンドの完全な構文を確認できます。

グループを作成する

これで、グループの作成方法を理解できます。 そのためには、アカウントを作成する前にグループを作成する必要があります。そうでない場合は、システム内の既存のグループを使用できます。 すべてのグループが /etc/groups ファイルにリストされています。

デフォルトグループはすべてシステムアカウント固有のグループであり、通常のアカウントに使用することはお勧めしません。 だから、次は新しいグループアカウントを作成するための構文です-

 groupadd [-g gid [-o]] [-r] [-f] groupname

次の表は、パラメータを示しています-

Sr.No. Option & Description
1

-g GID

グループのIDの数値

2

-o

このオプションにより、一意でないGIDを持つグループを追加できます

3

-r

このフラグは、 groupadd にシステムアカウントを追加するよう指示します

4

-f

このオプションは、指定されたグループが既に存在する場合、成功ステータスで終了します。 -gを使用すると、指定されたGIDが既に存在する場合、他の(一意の)GIDが選択されます

5

groupname

作成される実際のグループ名

パラメータを指定しない場合、システムはデフォルト値を使用します。

次の例は、デフォルト値で_developers_グループを作成します。これは、ほとんどの管理者にとって非常に受け入れられます。

$ groupadd developers

グループを変更する

グループを変更するには、 groupmod 構文を使用します-

$ groupmod -n new_modified_group_name old_group_name

developers_2グループ名をdeveloperに変更するには、次のように入力します-

$ groupmod -n developer developer_2

財務GIDを545に変更する方法は次のとおりです-

$ groupmod -g 545 developer

グループを削除する

これで、グループを削除する方法を理解できます。 既存のグループを削除するために必要なのは、* groupdelコマンド*と group name だけです。 金融グループを削除するには、コマンドは-

$ groupdel developer

これにより、グループのみが削除され、そのグループに関連付けられたファイルは削除されません。 ファイルには、所有者が引き続きアクセスできます。

アカウントを作成する

Unixシステムで新しいアカウントを作成する方法を見てみましょう。 以下は、ユーザーのアカウントを作成するための構文です-

useradd -d homedir -g groupname -m -s shell -u userid accountname

次の表は、パラメータを示しています-

Sr.No. Option & Description
1

-d homedir

アカウントのホームディレクトリを指定します

2

-g groupname

このアカウントのグループアカウントを指定します

3

-m

ホームディレクトリが存在しない場合は作成します

4

-s shell

このアカウントのデフォルトのシェルを指定します

5

-u userid

このアカウントのユーザーIDを指定できます

6

accountname

作成される実際のアカウント名

パラメータを指定しない場合、システムはデフォルト値を使用します。 useradd コマンドは、 /etc/passwd/etc/shadow 、および /etc/group ファイルを変更し、ホームディレクトリを作成します。

アカウント mcmohd を作成し、そのホームディレクトリを /home/mcmohd に設定し、グループを developers として設定する例を次に示します。 このユーザーにはKorn Shellが割り当てられます。

$ useradd -d/home/mcmohd -g developers -s/bin/ksh mcmohd

上記のコマンドを発行する前に、 _ groupadd_ コマンドを使用して_developers_グループが既に作成されていることを確認してください。

アカウントが作成されたら、次のように passwd コマンドを使用してパスワードを設定できます-

$ passwd mcmohd20
Changing password for user mcmohd20.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
*_passwd accountname_* と入力すると、スーパーユーザーであればパスワードを変更するオプションが表示されます。 それ以外の場合は、アカウント名を指定せずに同じコマンドを使用してパスワードのみを変更できます。

アカウントを変更する

*usermod* コマンドを使用すると、コマンドラインから既存のアカウントに変更を加えることができます。 *useradd* コマンドと同じ引数に加えて、アカウント名を変更できる-l引数を使用します。

たとえば、アカウント名 mcmohdmcmohd20 に変更し、それに応じてホームディレクトリを変更するには、次のコマンドを発行する必要があります-

$ usermod -d/home/mcmohd20 -m -l mcmohd mcmohd20

アカウントを削除する

*userdel* コマンドを使用して、既存のユーザーを削除できます。 注意して使用しない場合、これは非常に危険なコマンドです。

アカウントのホームディレクトリとメールファイルを削除するために、コマンド .r で使用できる引数またはオプションは1つだけです。

たとえば、アカウント_mcmohd20_を削除するには、次のコマンドを発行します-

$ userdel -r mcmohd20

バックアップのためにホームディレクトリを保持する場合は、*-r *オプションを省略します。 必要に応じて、後でホームディレクトリを削除できます。

Unix-システムパフォーマンス

この章では、Unixでのシステムパフォーマンスについて詳しく説明します。

Unixシステムのパフォーマンスを監視および管理するために利用できるいくつかの無料ツールを紹介します。 これらのツールは、Unix環境でパフォーマンスの問題を診断および修正する方法に関するガイドラインも提供します。

Unixには、監視と調整が必要な次の主要なリソースタイプがあります-

  • CPU
  • メモリ
  • ディスクスペース
  • 通信回線
  • * I/O時間*
  • ネットワーク時間
  • *アプリケーションプログラム *

パフォーマンスコンポーネント

次の表は、システム時間を占める5つの主要なコンポーネントを示しています-

Sr.No. Component & Description
1
  • User State CPU*

CPUがユーザー状態でユーザーのプログラムの実行に費やした実際の時間。 ライブラリ呼び出しの実行に費やされた時間は含まれますが、その代わりにカーネルで費やされた時間は含まれません

2

System State CPU

これは、このプログラムに代わってCPUがシステム状態に費やす時間です。 すべての* I/Oルーチン*にはカーネルサービスが必要です。 プログラマは、I/O転送をブロックすることでこの値に影響を与えることができます

3

I/O Time and Network Time

これは、データの移動とI/O要求の処理に費やされた時間です

4

Virtual Memory Performance

これには、コンテキストの切り替えとスワッピングが含まれます

5

Application Program

他のプログラムの実行に費やした時間-別のアプリケーションが現在CPUを持っているためにシステムがこのアプリケーションを処理していないとき

パフォーマンスツール

Unixは、Unixシステムのパフォーマンスを測定および微調整するための次の重要なツールを提供します-

Sr.No. Command & Description
1

nice/renice

変更されたスケジューリング優先順位でプログラムを実行します

2

netstat

ネットワーク接続、ルーティングテーブル、インターフェイス統計、マスカレード接続、およびマルチキャストメンバーシップを出力します

3

time

単純なコマンドの時間を計ったり、リソースの使用状況を示したりするのに役立ちます

4

uptime

これはシステム負荷平均です

5

ps

現在のプロセスのスナップショットを報告します

6

vmstat

仮想メモリの統計を報告します

7

gprof

コールグラフプロファイルデータを表示します

8

prof

プロセスプロファイリングを促進

9

top

システムタスクを表示します

link:/unix/unix-manpage-help [Manpage Help]を使用して、ここで説明する各コマンドの完全な構文を確認できます。

Unix-システムロギング

この章では、Unixでのシステムロギングについて詳しく説明します。

Unixシステムには非常に柔軟で強力なロギングシステムがあり、想像できるほとんどすべてを記録し、ログを操作して必要な情報を取得できます。

Unixの多くのバージョンは、 syslog と呼ばれる汎用のログ機能を提供します。 情報をログに記録する必要がある個々のプログラムは、情報をsyslogに送信します。

Unix _syslog_は、ホストで設定可能な統一されたシステムロギング機能です。 システムは、プログラム /etc/syslogd または /etc/syslog を実行する集中システムロギングプロセスを使用します。

システムロガーの操作は非常に簡単です。 プログラムは、ログエントリを_syslogd_に送信します。_syslogd_は、構成ファイル /etc/syslogd.conf または /etc/syslog を参照し、一致が見つかった場合、目的のログファイルにログメッセージを書き込みます。

あなたが理解する必要がある4つの基本的なsyslog用語があります-

Sr.No. Term & Description
1

Facility

ログメッセージを送信したアプリケーションまたはプロセスの説明に使用される識別子。 たとえば、メール、カーネル、ftp。

2

Priority

メッセージの重要性の指標。 レベルは、デバッグ情報から重要なイベントまで、ガイドラインとしてsyslog内で定義されます。

3

Selector

1つ以上の施設とレベルの組み合わせ。 着信イベントがセレクターに一致すると、アクションが実行されます。

4

Action

セレクターに一致する着信メッセージの処理—アクションは、メッセージをログファイルに書き込む、メッセージをコンソールまたは他のデバイスにエコーする、ログインユーザーにメッセージを書き込む、またはメッセージを別のsyslogサーバーに送信することができます。

syslogファシリティ

これで、syslog機能について理解できます。 セレクターで使用できる機能は次のとおりです。 Unixのすべてのバージョンにすべての機能が存在するわけではありません。

Facility Description
1

auth

名前とパスワードの要求に関連するアクティビティ(getty、su、login)

2

authpriv

authと同じですが、選択したユーザーのみが読み取れるファイルに記録されます

3

console

一般にシステムコンソールに送信されるメッセージをキャプチャするために使用

4

cron

cronシステムスケジューラからのメッセージ

5

daemon

システムデーモンキャッチオール

6

ftp

ftpデーモンに関連するメッセージ

7

kern

カーネルメッセージ

8

local0.local7

サイトごとに定義されたローカル施設

9

lpr

ライン印刷システムからのメッセージ

10

mail

メールシステムに関するメッセージ

11

mark

ログファイルにタイムスタンプを生成するために使用される疑似イベント

12

news

ネットワークニュースプロトコル(nntp)に関連するメッセージ

13

ntp

ネットワークタイムプロトコルに関連するメッセージ

14

user

通常のユーザープロセス

15

uucp

UUCPサブシステム

syslogの優先順位

syslogの優先順位は次の表にまとめられています-

Sr.No. Priority & Description
1

emerg

差し迫ったシステムクラッシュなどの緊急状態は、通常、すべてのユーザーにブロードキャストします

2

alert

破損したシステムデータベースなど、すぐに修正する必要がある条件

3

crit

ハードウェアエラーなどの重大な状態

4

err

通常のエラー

5

Warning

警告

6

notice

エラーではないが、おそらく特別な方法で処理する必要がある条件

7

info

情報メッセージ

8

debug

プログラムのデバッグ時に使用されるメッセージ

9

none

メッセージを記録しないことを指定するために使用される疑似レベル

機能とレベルの組み合わせにより、何がログに記録され、その情報がどこに保存されるかを識別できます。

各プログラムはメッセージをシステムロガーに忠実に送信するため、ロガーは、セレクターで定義されたレベルに基づいて、何を追跡し、何を破棄するかを決定します。

レベルを指定すると、システムはそのレベル以上のすべてを追跡します。

===/etc/syslog.confファイル

*/etc/syslog.conf* ファイルは、メッセージが記録される場所を制御します。 典型的な *syslog.conf* ファイルは次のようになります-
*.err;kern.debug;auth.notice/dev/console
daemon,auth.notice          /var/log/messages
lpr.info                    /var/log/lpr.log
mail.*                      /var/log/mail.log
ftp.*                       /var/log/ftp.log
auth.*                       @prep.ai.mit.edu
auth.*                       root,amrood
netinfo.err                 /var/log/netinfo.log
install.*                   /var/log/install.log
*.emerg                      *
*.alert                      |program_name
mark.*                      /dev/console

ファイルの各行には2つの部分が含まれています-

  • ログに記録するメッセージの種類を指定する*メッセージセレクター*。 たとえば、カーネルからのすべてのエラーメッセージまたはすべてのデバッグメッセージ。
  • メッセージで何をすべきかを示す*アクションフィールド*。 たとえば、ファイルに入れるか、メッセージをユーザーの端末に送信します。

上記の構成の注目すべき点は次のとおりです-

  • メッセージセレクタには、2つの部分があります。 a facilitya priority です。 たとえば、_kern.debug_は、カーネル(機能)によって生成されたすべてのデバッグメッセージ(優先度)を選択します。
  • メッセージセレクタ_kern.debug_は、debugよりも大きいすべての優先順位を選択します。
  • ファシリティまたは優先順位の代わりのアスタリスクは、「すべて」を示します。 たとえば、。debug はすべてのデバッグメッセージを意味し、 kern。はカーネルによって生成されたすべてのメッセージを意味します。
  • コンマを使用して複数の機能を指定することもできます。 セミコロンを使用して、2つ以上のセレクターをグループ化できます。

ロギングアクション

アクションフィールドは、5つのアクションのいずれかを指定します-

  • ログメッセージをファイルまたはデバイスに記録します。 たとえば、 /var/log/lpr.log または /dev/console
  • ユーザーにメッセージを送信します。 複数のユーザー名をコンマで区切って指定できます。たとえば、root、amrood。 すべてのユーザーにメッセージを送信します。 この場合、アクションフィールドはアスタリスクで構成されています。例えば、
  • メッセージをプログラムにパイプします。 この場合、プログラムはUnixパイプ記号(|)の後に指定されます。
  • 別のホストのsyslogにメッセージを送信します。 この場合、アクションフィールドは、アットマークが前に付いたホスト名で構成されます。たとえば、@ finddevguides.com。

ロガーコマンド

Unixは logger コマンドを提供します。これは、システムロギングを処理するのに非常に便利なコマンドです。 logger コマンドはロギングメッセージをsyslogdデーモンに送信し、その結果システムロギングを引き起こします。

これは、 syslogd デーモンとその構成をいつでもコマンドラインから確認できることを意味します。 loggerコマンドは、コマンドラインからシステムログファイルに1行のエントリを追加する方法を提供します。

コマンドの形式は-

logger [-i] [-f file] [-p priority] [-t tag] [message]...

ここにパラメータの詳細があります-

Sr.No. Option & Description
1

-f filename

ファイルfilenameの内容をログに記録するメッセージとして使用します。

2

-i

ロガープロセスのプロセスIDを各行に記録します。

3

-p priority

指定された優先度(指定されたセレクタエントリ)でメッセージを入力します。メッセージの優先度は、数値で指定するか、facility.priorityのペアとして指定できます。 デフォルトの優先度はuser.noticeです。

4

-t tag

指定されたタグでログに追加された各行をマークします。

5

message

内容が指定された順序でスペースで区切られて連結されている文字列引数。

link:/unix/unix-manpage-help [Manpage Help]を使用して、このコマンドの完全な構文を確認できます。

ログローテーション

ログファイルは非常に高速に成長し、大量のディスク領域を消費する傾向があります。 ログのローテーションを有効にするには、ほとんどのディストリビューションが newsysloglogrotate などのツールを使用します。

これらのツールは、* cronデーモン*を使用して、頻繁に呼び出す必要があります。 詳細については、_newsyslog_または_logrotate_のマニュアルページを確認してください。

重要なログの場所

すべてのシステムアプリケーションは、ログファイルを /var/log とそのサブディレクトリに作成します。 ここにいくつかの重要なアプリケーションとそれに対応するログディレクトリがあります-

Application Directory
httpd /var/log/httpd
samba /var/log/samba
cron /var/log/
mail /var/log/
mysql /var/log/

Unix-シグナルとトラップ

この章では、Unixのシグナルとトラップについて詳しく説明します。

シグナルは、重要なイベントが発生したことを示すためにプログラムに送信されるソフトウェア割り込みです。 イベントは、ユーザーの要求から不正なメモリアクセスエラーまでさまざまです。 割り込み信号などの一部の信号は、ユーザーがプログラムに通常の制御フローにない何かを行うように要求したことを示します。

次の表に、遭遇する可能性があり、プログラムで使用する一般的な信号を示します-

Signal Name Signal Number Description
SIGHUP 1 Hang up detected on controlling terminal or death of controlling process
SIGINT 2 Issued if the user sends an interrupt signal (Ctrl + C)
SIGQUIT 3 Issued if the user sends a quit signal (Ctrl + D)
SIGFPE 8 Issued if an illegal mathematical operation is attempted
SIGKILL 9 If a process gets this signal it must quit immediately and will not perform any clean-up operations
SIGALRM 14 Alarm clock signal (used for timers)
SIGTERM 15 Software termination signal (sent by kill by default)

信号のリスト

システムでサポートされているすべての信号をリストする簡単な方法があります。 kill -l コマンドを発行すると、サポートされているすべての信号が表示されます-

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

信号の実際のリストは、Solaris、HP-UX、およびLinuxによって異なります。

デフォルトのアクション

すべてのシグナルには、デフォルトアクションが関連付けられています。 シグナルのデフォルトのアクションは、スクリプトまたはプログラムがシグナルを受信したときに実行するアクションです。

可能なデフォルトのアクションのいくつかは次のとおりです-

  • プロセスを終了します。
  • 信号を無視します。
  • ダンプコア。 これにより、 core というファイルが作成され、シグナルを受信したプロセスのメモリイメージが含まれます。
  • プロセスを停止します。
  • 停止したプロセスを続行します。

信号を送る

信号をプログラムまたはスクリプトに配信する方法はいくつかあります。 最も一般的な方法の1つは、ユーザーがスクリプトの実行中に CONTROL-C または* INTERRUPTキー*を入力することです。

*_Ctrl + C_* キーを押すと、 *SIGINT* がスクリプトに送信され、定義済みのデフォルトアクションスクリプトに従って終了します。

信号を配信する他の一般的な方法は、* killコマンド*を使用することです。その構文は次のとおりです-

$ kill -signal pid

ここで、 signal は配信するシグナルの番号または名前であり、 pid はシグナルの送信先のプロセスIDです。 例-

$ kill -1 1001

上記のコマンドは、*プロセスID 1001 *で実行されているプログラムにHUPまたはハングアップ信号を送信します。 同じプロセスにキル信号を送信するには、次のコマンドを使用します-

$ kill -9 1001

これにより、*プロセスID 1001 *で実行されているプロセスが強制終了されます。

信号の捕捉

シェルプログラムの実行中に端末で_Ctrl + C_またはBreakキーを押すと、通常、そのプログラムはすぐに終了し、コマンドプロンプトに戻ります。 これは常に望ましいとは限りません。 たとえば、クリーンアップされない一時ファイルの束を残すことがあります。

これらの信号をトラップすることは非常に簡単であり、トラップコマンドには次の構文があります-

$ trap commands signals

ここで、_command_は任意の有効なUnixコマンド、またはユーザー定義関数である場合があり、signalはトラップする任意の数のシグナルのリストです。

シェルスクリプトのトラップには2つの一般的な用途があります-

  • 一時ファイルをクリーンアップする
  • 信号を無視

一時ファイルのクリーンアップ

trapコマンドの例として、以下は、いくつかのファイルを削除し、誰かが端末からプログラムを中止しようとした場合に終了する方法を示しています-

$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2

このトラップが実行されるシェルプログラムのポイントから、シグナル番号2がプログラムによって受信されると、2つのファイル _work1 _* および *_dataout _ が自動的に削除されます。

したがって、このトラップの実行後にユーザーがプログラムの実行を中断した場合、これらの2つのファイルがクリーンアップされることが保証されます。 rm に続く exit コマンドが必要です。これがないと、プログラムは信号を受信したときに中断した時点で実行が継続されるためです。

*hangup* に対してシグナル番号1が生成されます。 誰かが意図的に回線を切るか、回線が誤って切断されます。

この場合、シグナル番号1をシグナルのリストに追加することにより、前述のトラップを変更して、指定された2つのファイルも削除できます-

$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2

これで、回線がハングアップした場合、または_Ctrl + C_キーが押された場合、これらのファイルは削除されます。

トラップするように指定されたコマンドに複数のコマンドが含まれる場合は、引用符で囲む必要があります。 また、トラップコマンドが実行されたとき、およびリストされた信号の1つが受信されたときに、シェルがコマンドラインをスキャンすることに注意してください。

したがって、前の例では、トラップコマンドの実行時に WORKDIR および $$ の値が置換されます。 シグナル1または2が受信されたときにこの置換が発生するようにしたい場合は、コマンドを単一引用符で囲むことができます-

$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2

信号を無視する

トラップ用にリストされたコマンドがヌルの場合、指定されたシグナルは受信時に無視されます。 たとえば、コマンド-

$ trap '' 2

これは、割り込み信号を無視することを指定します。 中断したくない操作を実行するときに、特定の信号を無視したい場合があります。 次のように無視される複数の信号を指定できます-

$ trap '' 1 2 3 15

最初の引数は無視される信号のために指定する必要があり、それ自体が別の意味を持つ次の記述と同等ではないことに注意してください-

$ trap  2

シグナルを無視すると、すべてのサブシェルもそのシグナルを無視します。 ただし、信号の受信時に実行するアクションを指定した場合、すべてのサブシェルはその信号の受信時にデフォルトのアクションを実行します。

トラップのリセット

シグナルの受信時に実行されるデフォルトのアクションを変更した後、最初の引数を単に省略した場合、トラップを使用して再度アクションを変更できます。そう-

$ trap 1 2

これにより、シグナル1または2の受信時に実行されるアクションがデフォルトにリセットされます。