Linuxコマンドを勉強~ファイル表示、リダイレクト、パイプ~

ファイルの表示

ファイルを表示するコマンドは代表的なもので9個ほどあります。

cat 指定したファイルの内容をすべて表示します。
more ファイルを1画面ずつ表示します。SPACEキーでページ送りをします。画面を最後までスクロールすると表示を止めます。
less ファイルを1画面ずつ表示します。SPACEキーでページ送りをします。こちらは最後までスクロールしても表示は止まりません。ファイルの閲覧を終了するときはqキーを押します。
nl 行番号付きでファイルを表示します。
tac ファイルを末尾の行から表示します。
tee キーボード入力された内容をファイルと画面の両方に出力します。
head ファイルの先頭の方を表示します
tail ファイルの末尾の方を表示します。
od ファイルの内容を8進数で表示します。

viコマンドはあくまで編集のためにファイルを表示していますが、これらは読み取り専用でファイルを表示します(teeは除く)。
catに至ってはファイルの内容を画面に一気に表示してコマンドを終了するため、長いファイルは全く内容を読めません。
そこでページャと呼ばれるmoreやlessコマンドを使って1画面ずつファイルを表示します。

ちなみに、manコマンドはマニュアルファイルをlessコマンドで開いています。

それぞれどういった表示をするか表にしました。
例として、次のような2つのファイルがあるとします。
<ファイル名>
a.txt
<内容>
aaa
bbb
ccc

<ファイル名>
b.txt
<内容>
ddd
eee
fff

コマンド 表示されるファイルの内容 備考
cat a.txt b.txt 指定したファイルを連結してすべて表示しています。
more a.txt b.txt 指定したファイルをスクロールしながらすべて表示しています。
less a.txt b.txt 複数ファイルを開いた場合、「:n」とすると次のファイルを表示します。「:p」なら前のファイルを表示。
nl a.txt b.txt nlコマンドは空の行には行番号を付けません。空の行にも番号付けする場合は「cat -n」とします。
tac a.txt b.txt 1ファイルずつ逆に表示しています。
tee c.txt -aオプションを付けると、開いたファイルに追記していきます。
head -n 2 a.txt b.txt -nオプションを付けると、先頭何行目まで表示するか指定できます。
tail -n 2 a.txt b.txt -nオプションを付けると、末尾何行目まで表示するか指定できます。-fオプションを付けるとコマンドは終了せず、最後の行を表示し続けます。ログ監視などに使ったりします。
od a.txt 0000000 060541 005141 061142 005142 061543 005143
0000014
-xオプションを付けると、16進表記で表示します。-cオプションを付けるとASCII文字とエスケープ記号(\nなど)で表示します。バイナリファイルの表示などに使います。

※teeコマンドだけは表示と保存を両方行うので別ファイルで試しています。

リダイレクト

lsコマンドを実行すると、ディレクトリの内容がコマンドラインの下に表示されました。

viコマンドを実行すると、ファイルの内容が画面に表示されます。
エディタなのでさらにその画面でファイルを編集できました。
しかも、viエディタはファイルを開きながらコマンドを打てました。

いったいなぜそんなことができるのか・・・。

Linuxでは、コマンドを実行するとプロセスというものが作成されます。
まあ、プロセスについての詳細は後で・・・(そればっかだなー)

何かプログラムが実行されるとプロセスという単位でその実行したプログラムを管理します。
つまり、lsコマンドを実行すると、lsコマンドを実行するためのプロセスが作成されるということです。

プログラムは必要があれば外部とアクセスする必要があります(ファイルなど)。
プロセスは、プログラムがアクセスしているファイルなどを識別するための情報を持っているのです。
それはファイルディスクリプタ(ファイル記述子)と呼ばれます。

プロセスはデフォルトで、3つのファイルディスクリプタを用意しています。
1つ目は標準入力とアクセスする場合のファイルディスクリプタ。
2つ目は標準出力とアクセスする場合のファイルディスクリプタ。
3つ目は標準エラーとアクセスする場合のファイルディスクリプタ。

ファイルディスクリプタは、0から始まる整数が割り当てられます。
割り当てられるファイルディスクリプタも合わせて、標準入出力を次に説明します。

説明 ファイルディスクリプタ
標準入力 キーボードからの入力 0
標準出力 画面への出力 1
標準エラー 画面への出力は標準出力と同じだが、別々に画面に出力される 2

標準入出力以外のファイルにアクセスする場合は、ファイルをオープンする度に別のファイルディスクリプタ(3から順に増えていく)が逐次割り当てられていくことになります。

lsコマンドが実行されると、lsコマンドのプロセスは、プログラムが指定されたファイルの情報を標準出力(ファイルディスクリプタ:1)を使って画面に出力しているということです。

1

リダイレクトというのは、プロセスに対する入出力の方向(標準出力だったら画面へ向かう流れ)を変えてしまうことを言います。

例えばlsコマンドがその結果を画面に出力しようとしています。
それを標準出力ではなく、別のファイルに出力することができます。

出力のリダイレクトを行うには、”>”を使います。

上記のように、リダイレクトの記号の前にファイル記述子を付けます。
ファイル記述子を省略すると、1番(標準出力)のリダイレクト、となります。

2

標準エラーの場合は、”ls 2> a.txt”といった具合になります。

標準出力、標準エラー両方ともリダイレクトする場合は”&>”あるいは”>&”とします。

3

もしくは、次のように書けます。

標準出力と標準エラーのリダイレクト先が異なる場合は「1> リダイレクト先1 2> リダイレクト先2」と書きますが、その標準エラーのリダイレクト先を1番のファイルディスクリプタとしているわけです。

4

※ファイル出力へリダイレクトする際、”>>”とすると、ファイルに追記する形になります。”>”では、毎回新規にファイルを上書きしてしまいます。

標準入力をリダイレクトすることもできます。その場合は、”<"とします。 前述したファイルの内容を画面に出力するcatコマンド、普通は見るファイル名をcatコマンドで指定するのですが、ファイルのオープンでなく、標準入力からファイルの内容を取得することもできます。

とします。 5

パイプ

パイプは、コマンドの出力を次のコマンドの標準入力にします。
例えば、catコマンドで開いた複数ファイルの内容をmoreコマンドのように1ファイルとして読むことができます。
コマンドではこうなります。

コマンドどうしを”|”でつなげています。

図にするとこんな感じです。

6

じゃあ最初のコマンドでエラーが出たらどうなるんだ?というのも少し考えてみました。

7

コマンドの連続実行

パイプはコマンドの標準出力を次の標準入力にする機能ですが、
1行のコマンドラインで複数のコマンドを連続で実行させることもできます。

パイプと違い、標準出力は関係ありません。

とコマンドを”;”でつなげると、コマンド1の結果によらず、コマンド2を実行します。

とコマンドを”&&”でつなげると、コマンド1が正常に終了した場合のみコマンド2を実行します。

とコマンドを”||”でつなげると、コマンド1が正常に終了しなかった場合のみコマンド2を実行します。

次はファイル内操作のコマンドを勉強します。

広告
  • LINEで送る