PR

Linuxの基本3(標準入出力・入出力リダイレクト・パイプ・基本コマンド)

IT

Linuxの基本3

ここでは、Linuxの基本となる標準入出力・入出力リダイレクト・パイプ・基本コマンドについての解説をします。
Linuxについての基本情報を知りましょう!!

Linuxの基本2はこちら

 

標準入出力

Linux上でコマンドを実行するとき、一般的にはキーボードでコマンドやコマンドが求めるデータを入力して、その結果がモニタに出力されます。これらをそれぞれ「標準入力」、「標準出力」と呼びます。実行したコマンド処理に異常がありエラーメッセージをモニタに出力することを標準エラー出力と呼びます。また、これら3つをまとめて標準入出力といいます。 Linuxでは標準入出力の識別に数値を使っており、標準入力は「0」、標準出力は「1」、標準エラー出力は「2」の数値が割り当てられています。標準入出力の理解は86以降のリダイレクトや91のパイプの理解に役立ちます。

入力リダイレクト(0<) 

リダイレクトとは、「向け直す」という意味で、Linuxのリダイレクトはコマンドの標準入力や標準出力をファイルに変更することをいいます。コマンドライン上では「<」または「>」の記号を使ってリダイレクトを指示します。入力リダイレクトを使うと、キーボードから入力する代わりにファイルの内容をコマンドに渡すことができます。
「$コマンド0<ファイル名」のように表記できますが、入力リダイレクトの「0」は省略できるので「$コマンド<ファイル名」のように表記するのが一般的です。

出力リダイレクト(1>、1>>) 

出力リダイレクトを使うと、通常モニタに出力されるコマンドの結果を指定ファイルに出力させることができます。「$コマンド1>ファイル名」のように指定するとコマンドの結果はモニタに表示されず、指定したファイルに記載されます。ただし、「1>」だとファイル内容が上書きされてしまう点に注意が必要です。
ファイルを上書きしたくない場合は、「$コマンド1>>ファイル名」のようにリダイレクト記号を2つ連続することで追記させることができます。いずれのケースも出力リダイレクトの「1」は省略が可能です。

エラーリダイレクト(2>、2>>) 

コマンド処理に異常がありエラーメッセージが出力される場合、標準エラー出力としてモニタが出力先となります。エラーリダイレクトを使うことで、エラーメッセージをモニタではなく指定したファイルに出力することができます。「$コマンド2>ファイル名」のように指定すると指定ファイルにエラーメッセージが上書きされます。
上書きしたくない場合は「$コマンド2>>ファイル名」のようにリダイレクト記号を2つ連続することで追記させることができます。

特殊なリダイレクト(2>&1) 

標準出力と標準エラー出力はモニタなので、通常コマンドの実行結果は正常に終了しても異常に終了してもモニタに表示されます。リダイレクト時は指定した記号により区別されますが、コマンドの実行結果と同様に正常か異常かにかかわらず、同じファイルに結果を出力したい場合は特殊なリダイレクト記号を用います。
「$コマンド>ファイル名2>&1」のように、標準出力をファイルにリダイレクトして末尾に「2>&1」を付与することで標準エラー出力の出力先を標準出力と同じファイルにすることができます。

ヒアドキュメント(<<) 

リダイレクトを用いて改行を含む任意の文字列を標準出力させる機能をヒアドキュメントといいます。指定した終端文字が入力されるまで標準入力に任意の文字列を送り続け、終了すると入力した文字列がモニタ上に標準出力されます。
「$cat<<終端文字」のようにcatコマンドとリダイレクト記号の「<<」を組み合わせることで実行できます。
ヒアドキュメントの標準出力をリダイレクトすることで、viエディタなどのテキストエディタを使わずにファイルの作成も可能です。

パイプ

パイプとは、あるコマンドの標準出力を別のコマンドの標準入力に渡す処理のことをいいます。「$コマンドA|コマンドB」のようにパイプを示す記号「|(バーティカルバー)」で複数のコマンドをつなぐことで、コマンドAの実行結果が標準出力からコマンドBの標準入力に引き渡され、そのデータをもとにコマンドBが実行されます。
パイプを使って複数コマンドを組み合わせることで、単一のコマンドでは実行できない複雑なコマンド処理を実現させることができます。 パイプでつなげることができるコマンドの数に制限はありません。よく次項以降に紹介するフィルタコマンドと組み合わされることが多いです。

フィルタコマンド

フィルタコマンドとは、標準入力からデータを受け取り、何らかの処理や加工を行った上で標準出力に結果を出力するコマンド全般のことを指します。あくまで加工して表示するだけなので、元ファイルへ変更を保存することはしません。
リダイレクトと併用することで、加工元のデータをキーボード入力ではなくファイル読み込みにしたり、加工処理した結果をモニタではなくファイルに出力したりすることができます。
またパイプを使用することで、複数のフィルタコマンドを用いて複雑な処理を実行させることもできます。

teeコマンド

teeコマンドを使うと、標準入力から受け取ったデータを標準出力先であるモニタと指定したファイルの両方に出力することができます。例えば「ls-l/」の結果を標準入力として、teeコマンドに渡しモニタと指定ファイルに出力する場合は、パイプを用いて「ls-l/|teesample.txt」のように指定します。
通常teeコマンドで指定したファイルには、標準入力の内容が上書きされますが、オプション-aを付与することで既存のファイルへの追記とすることができます。

catコマンドとlessコマンド

catコマンドの語源はconCATnate(連結)で、複数ファイルの中身を連結させて標準出力に出力できることに由来しています。一般的には単一のファイルを指定して標準出力にファイルの中身を出力させる用途で使われます。catで指定したファイルの中身は指定した順に画面に出力されます。
行数が多いと画面に収まらず見切れてしまいます。そこでcatの代わりにlessコマンドを使うと、1画面ずつ順にファイルの中身を表示させることができます。Enterキーで次の行に進み、Spaceキーで一画面分進んだあと「q」を入力すると表示を終了します。

headコマンドとtailコマンド

headコマンドはファイル先頭の指定した行数の内容を表示します。行数を指定しない場合はデフォルトで先頭10行の内容が表示されます。行数を指定する場合はオプション-nの後に行数を入力します。
tailコマンドはファイル末尾の指定した行数の内容を表示します。headコマンドと同様に行数指定がない場合はデフォルトで末尾10行が表示され、行数を指定する際はオプション-nを使います。また、オプション-fを使うと末尾に行が追加される度にリアルタイムで表示させることができます。

cutコマンドとgrepコマンド

ファイルから特定の情報のみを切り取って表示させたい場合、cutコマンドやgrepコマンドを使うと便利です。cutコマンドはファイルから必要なフィールドや列のみを取り出して表示します。
例の/etc/passwdファイルは「:(コロン)」でフィールドが区切られているため、オプション-dで区切り文字の「:」を指定し、オプション-fで1,7フィールドを指定すると指定フィールドの内容のみ表示されます。grepコマンドはファイルから指定したパターンと合致する行のみを表示できます。例のようにパイプを用いて他コマンドの標準入出力に対して使うこともできます。

sortコマンドとuniqコマンド

sortコマンドを使うと、ファイルの内容を並べ替えて表示させることができます。オプションを使わずに実行すると内容を昇順に並べ替えます。オプション-rを使うと降順に並べ替えることもできます。
uniqコマンドはファイルの内容で重複している行を取り除きます。例のtest_sort.txtは「1」という行が重複しているので、2行あったものが1行になって表示されています。uniqコマンドは隣接した行を比較して重複を判定するため、事前にsortコマンドなどで並べ替える必要があります。

expandコマンドとunexpandコマンド

テキスト作成などにおいて、行頭に空白を入れたり単語と単語の間を区切ったりする場合、タブやスペースを用いて空白を挿入します。スペースは1文字分の空白であるのに対して、タブは特定文字数分の空白を表す特殊な文字です。
Linuxではexpandコマンドを使うと、ファイル内のタブをスペースに変換して表示できます。オプション-tによりタブの文字数をデフォルトの8から任意の文字数に変更できます。 逆にスペースからタブに変換して表示したい場合は、unexpandコマンドを使います。

xargsコマンド

xargsコマンドにより、パイプなどから受け取った標準入力を指定コマンドの引数にして実行させることができます。
xargsコマンドの書式を用いて実行させたいコマンドを指定します。例えばファイルを削除するrmコマンドを使う場合、rmの後にファイル名を引数として指定する必要があります。rmコマンドは標準入力からファイルを受け取れない仕組みのため、パイプの後に直接指定することはできません。
xargsコマンドを使うと例のように別のコマンド(DIR_test_xargs)結果を標準入力として受け取りrmの引数にできます。lsDIR_test_xargsの結果が大量にある場合、rmの引数を手入力すると手間ですが、例の通りxargsを使うと簡潔に実行できます。

sedコマンド

sedコマンドを使うと指定したファイルの内容を編集コマンドを用いて処理して表示します。コマンド名はテキストエディタの一種である「StreamEDitor」を省略したものです。
編集コマンドとは、ファイルに対して実行したい処理を指定するための専用のコマンドです。 書式は「sed[オプション]編集コマンドファイル名」の順で指定します。例えばファイル内の全ての“old”という文字列を“new”に変換して表示したい場合は「seds/old/new/gsample.txt」と指定します。

viエディタ(vimエディタ)

viエディタはUNIXで標準的に使われているテキストエディタです。Linuxではviの拡張版であるvimを採用しています。
エディタ起動時はコマンドライン上で「viファイル名」と指定します。viエディタではコマンドモードと入力モード(挿入モード)があり、起動するとまずコマンドモードに移行します。コマンドモードではコピーや貼り付けなど各種操作を行うことができます。文字入力するにはモード切替コマンド(a,i,o等)により入力モードへ移行します。コマンドモードに戻るにはESCキーを押下します。viエディタの終了はコマンドモードでvi終了を指定するコマンド(:wq,:q!等)を使って終了させます。

まとめ

  • 入力リダイレクトの記号は「 0< または < 」
  • 出力リダイレクトの記号は「 1> または > または 1>> または >> 」
  • エラーリダイレクトの記号は「 2> または 2>> 」
  • エラー出力を標準出力へリダイレクトするとき末尾に付与する記号は「 2>&1 」
  • ヒアドキュメントの記号は「 << 」
  • コマンドの結果を次のコマンドへ渡すときに使う記号は「 | 」
  • ファイルの内容表示ができる代表的な2つのコマンド「 cat、less 」
  • 指定した文字列を含む行のみを表示するコマンドは「grep」
  • 与えられたデータを並べ替えるコマンドは「sort」
  • UNIXで標準的に使われるテキストエディタを「vi または vim」

本記事を読んている人へのお勧めの本

タイトルとURLをコピーしました