はじめに
この実験(Lab)では、Linux でテキストファイルを管理し、シェル環境をカスタマイズするための基本的なスキルを習得します。標準出力と標準エラー出力をファイルにリダイレクトする方法、異なるストリームを組み合わせる方法、そしてタスクを自動化するための強力なコマンドパイプラインを構築する方法を学びます。
さらに、広く使用されている強力なテキストエディタである Vim を使用してテキストファイルを編集する基本を学びます。最後に、コマンドラインエクスペリエンスをパーソナライズし、生産性を向上させるために、シェル変数とエイリアスを構成し、利用する方法を学びます。
標準出力をファイルにリダイレクトする
このステップでは、コマンドの標準出力をファイルにリダイレクトする方法を学びます。これは Linux システム管理における基本的なスキルであり、後で分析、ロギング、またはさらなる処理のためにコマンドの結果をキャプチャすることを可能にします。
シェルは、入出力の管理に特別なファイル記述子を使用します。最も一般的なものは次のとおりです。
0: 標準入力(stdin) - 通常はキーボードから。1: 標準出力(stdout) - 通常は端末画面へ。2: 標準エラー(stderr) - 通常はエラーメッセージ用の端末画面へ。
このセクションでは、stdout のリダイレクトに焦点を当てます。
> を使用してファイルを上書きする
> 演算子は、コマンドの標準出力を指定されたファイルにリダイレクトします。ファイルが存在しない場合は、作成されます。ファイルが既に存在する場合は、その内容が上書きされます。
現在の日時を使用して簡単なテキストファイルを作成することから始めましょう。
まず、ホームディレクトリの
projectフォルダにいることを確認します。cd ~/project[labex@host project]$次に、
dateコマンドを使用し、その出力をcurrent_datetime.txtという新しいファイルにリダイレクトします。date > current_datetime.txtこのコマンドは
dateを実行しますが、日付を端末に出力する代わりに、それをcurrent_datetime.txtに保存します。catコマンドを使用して、ファイルの内容を確認します。cat current_datetime.txtMon Day XX HH:MM:SS AM/PM TimeZone YYYY出力には、上記の例と同様に、現在の日時が表示されます。
次に、
echoの出力を同じファイルにリダイレクトしてみましょう。これにより、以前の内容が上書きされます。echo "This is a new line of text." > current_datetime.txtもう一度ファイルの内容を確認します。
cat current_datetime.txtThis is a new line of text.ご覧のように、元の日時が新しいテキスト行に置き換えられました。
>> を使用してファイルに追加する
>> 演算子は、コマンドの標準出力を指定されたファイルにリダイレクトし、新しい内容をファイルの末尾に追加します。ファイルが存在しない場合は、作成されます。
current_datetime.txt ファイルにさらに内容を追加してみましょう。
current_datetime.txtに別のテキスト行を追加します。echo "This line is appended." >> current_datetime.txtファイルの内容を表示します。
cat current_datetime.txtThis is a new line of text. This line is appended.新しい行が既存の内容の後に追加されたことに注意してください。
もう一度現在の日時を追加してみましょう。
date >> current_datetime.txtもう一度ファイルの内容を確認します。
cat current_datetime.txtThis is a new line of text. This line is appended. Mon Day XX HH:MM:SS AM/PM TimeZone YYYY日時がファイルの末尾に表示されるようになりました。
他のコマンドの出力をリダイレクトする
ほとんどすべてのコマンドの出力をリダイレクトできます。ls と wc の出力をリダイレクトしてみましょう。
ls -l(詳細リスト形式)の出力をfile_list.txtというファイルにリダイレクトします。ls -l > file_list.txtfile_list.txtの内容を調べます。cat file_list.txttotal 4 -rw-r--r-- 1 labex labex 80 Jun 4 07:04 current_datetime.txt -rw-r--r-- 1 labex labex 0 Jun 4 07:04 file_list.txtこのファイルには、現在のディレクトリ内のファイルの詳しいリストが含まれるようになりました。正確なファイルサイズとタイムスタンプは、コマンドを実行した時間によって異なります。
次に、
wc -lを使用してfile_list.txtの行数をカウントし、そのカウントを別のファイルline_count.txtにリダイレクトします。wc -l file_list.txt > line_count.txtline_count.txtの内容を表示します。cat line_count.txt3 file_list.txt出力は、
file_list.txtが 3 行(total行と 2 つのファイルエントリを含む)であることを示しています。
これで、標準出力をリダイレクトする最初の部分が終了しました。> を使用してファイルを作成および上書きし、>> を使用してファイルに追加する方法を学びました。
標準エラーのリダイレクトとストリームの結合
このステップでは、標準エラー(stderr)をリダイレクトする方法と、stdout と stderr を単一のストリームに結合する方法を学びます。これは、コマンドによって生成されたエラーメッセージを管理するために不可欠であり、必要に応じてログに記録したり、破棄したりできます。
stderr はファイル記述子 2 であることを思い出してください。エラーメッセージをリダイレクトするには 2> を使用します。
標準エラーをファイルにリダイレクトする
場合によっては、標準出力とは別にキャプチャしたいエラーメッセージがコマンドから生成されることがあります。
~/projectディレクトリにいることを確認します。cd ~/project[labex@host project]$存在しないディレクトリの内容をリスト表示してみましょう。これにより、エラーメッセージが生成されます。
ls non_existent_directoryls: cannot access 'non_existent_directory': No such file or directoryエラーメッセージが端末に直接出力されているのがわかります。
次に、このエラーメッセージを
errors.logというファイルにリダイレクトします。ls non_existent_directory 2> errors.log今回は、エラーメッセージが端末に表示されません。
errors.logの内容を確認します。cat errors.logls: cannot access 'non_existent_directory': No such file or directoryエラーメッセージがファイルに保存されました。
標準エラーを破棄する
多くの場合、不要なノイズの多いエラーメッセージを生成するコマンドを実行したい場合があります。そのような場合は、stderr を /dev/null にリダイレクトできます。/dev/null は、そこに書き込まれたすべてのデータを破棄する特別なデバイスファイルです。
存在しないディレクトリで
lsコマンドをもう一度試しますが、今回はエラーを破棄します。ls non_existent_directory 2> /dev/null端末には何も出力されず、エラーメッセージもファイルに保存されません。
標準出力と標準エラーを結合する
stdout と stderr の両方を同じファイルにキャプチャしたい場合があります。これはいくつかの方法で行うことができます。
方法 1: > file 2>&1
この方法は、stdout をファイルにリダイレクトし、次に stderr を stdout と同じ場所にリダイレクトします。順序 2>&1 が重要です。これは、「ファイル記述子 2 (stderr) をファイル記述子 1 (stdout) と同じ場所にリダイレクトする」ことを意味します。
標準出力と標準エラーの両方を生成するコマンドを作成しましょう。
findを使用して、アクセス許可のあるディレクトリとアクセス許可のないディレクトリでファイルを検索します。find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1ここで、
find ~/project -name "current_datetime.txt"はstdoutを生成し(見つかった場合)、find /root -name "current_datetime.txt"は、アクセス許可の問題により、おそらくstderrを生成します。combined_output.logファイルを調べます。cat combined_output.log/home/labex/project/current_datetime.txt find: ‘/root’: Permission denied成功した出力(ファイルのパス)とエラーメッセージの両方が同じファイルにキャプチャされていることがわかります。
方法 2: &> file (Bash 固有)
Bash は、stdout と stderr をファイルに結合するための短縮形 &> を提供しています。これは > file 2>&1 と同等です。
&>短縮形を使用して、同じfindコマンドを試してみましょう。find ~/project /root -name "file_list.txt" &> combined_output_shorthand.logcombined_output_shorthand.logの内容を確認します。cat combined_output_shorthand.log/home/labex/project/file_list.txt find: ‘/root’: Permission denied結果は前の方法と同じであり、
&>の便利さを示しています。
結合されたストリームを追加する
stdout と同様に、>> file 2>&1 または &>> file を使用して、結合された stdout と stderr をファイルに追加できます。
さらに出力とエラーを
combined_output.logに追加します。find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1更新された
combined_output.logを表示します。cat combined_output.log/home/labex/project/current_datetime.txt find: ‘/root’: Permission denied /home/labex/project/line_count.txt find: ‘/root’: Permission denied新しい出力とエラーが既存の内容に追加されます。
これで、標準エラーをリダイレクトする方法と、標準出力と標準エラーを単一のファイルに結合する方法を正常に学習しました。この知識は、堅牢なスクリプト作成とシステム管理タスクに不可欠です。
コマンドパイプラインの構築と理解
このステップでは、コマンドパイプラインについて学びます。これは Linux シェルにおける強力な機能であり、複数のコマンドを連鎖させることができます。あるコマンドの出力が次のコマンドの入力となり、複雑なデータ処理と操作が可能になります。
パイプ演算子 | (縦棒) は、パイプラインでコマンドを接続するために使用されます。これは、左側のコマンドの標準出力(stdout)を、右側のコマンドの標準入力(stdin)にリダイレクトします。
基本的なパイプライン
パイプラインの仕組みを理解するために、簡単な例から始めましょう。
~/projectディレクトリにいることを確認します。cd ~/project[labex@host project]$まず、現在のディレクトリ内のファイルをリスト表示してみましょう。
lscombined_output.log combined_output_shorthand.log current_datetime.txt errors.log file_list.txt line_count.txt次に、
lsの出力をwc -lコマンドにパイプし、受け取った行数をカウントします。ls | wc -l6lsコマンドはファイルをリスト表示し、その出力(各ファイル名が新しい行に表示される)がwc -lに入力として供給され、wc -lはこれらの行をカウントし、現在の場所にあるファイル/ディレクトリの数を効果的に示します。別の一般的なユースケースを試してみましょう。
ls -lをlessにパイプして、ページ単位の出力を表示します。これは、コマンドが単一の画面に収まらないほど多くの出力を生成する場合に役立ちます。ls -l /usr/bin | lesstotal 200000 -rwxr-xr-x 1 root root 12345 Jan XX HH:MM [filename] ... (press 'q' to quit less) ...ls -l /usr/binコマンドは、/usr/bin内のすべてのファイルを詳細情報とともにリスト表示します。この出力はlessに送信され、ページごとにスクロールできます。qを押してlessを終了します。
grep を使用した出力のフィルタリング
grep コマンドは、特定のパターンに一致する行をフィルタリングするためにパイプラインでよく使用されます。
ps auxを使用してシステムで実行されているすべてのプロセスをリスト表示し、次にbashに関連するプロセスをフィルタリングします。ps aux | grep bashlabex 1234 0.0 0.1 12345 6789 ? Ss HH:MM 0:00 /usr/bin/bash labex 5678 0.0 0.0 9876 5432 pts/0 S+ HH:MM 0:00 grep bashps auxコマンドは、実行中のすべてのプロセスをリスト表示します。その出力はgrep bashにパイプされ、grep bashは「bash」という単語を含む行のみを表示します。現在の bash シェルとgrepコマンド自体の 2 行が表示される場合があります。grepコマンドを出力から除外するには、grep -v(反転マッチ)を使用するか、パターンを洗練させることができます。grep -v grepを試してみましょう。ps aux | grep bash | grep -v greplabex 1234 0.0 0.1 12345 6789 ? Ss HH:MM 0:00 /usr/bin/bashこれで、実際の bash プロセスのみが表示されます。
sort と uniq の使用
sort はテキストの行をソートするために使用され、uniq は繰り返される行を報告または省略するために使用されます。これらは一緒に使用されることがよくあります。
ソートされていない、繰り返される単語を含むファイルを作成しましょう。
echo -e "apple\nbanana\napple\norange\nbanana" > fruits.txtfruits.txtの内容を表示します。cat fruits.txtapple banana apple orange banana次に、
fruits.txtの行をソートしましょう。cat fruits.txt | sortapple apple banana banana orangeソートされた一意の単語のみを取得するには、
sortの出力をuniqにパイプします。cat fruits.txt | sort | uniqapple banana orangeこのパイプラインは、最初に線をソートし、次に
uniqが隣接する重複行を削除します。
tee コマンド
tee コマンドは、パイプラインで特別な役割を果たします。標準入力を読み取り、標準出力に書き込み、同時に 1 つ以上のファイルに書き込みます。これは、パイプ内の「T」ジャンクションのようなもので、データが 2 つの方向に流れることを可能にします。
ファイルをリスト表示し、出力を
ls_output.txtに保存すると同時に、画面にも表示します。ls -l | tee ls_output.txttotal 24 -rw-r--r-- 1 labex labex 123 Jan XX HH:MM combined_output.log -rw-r--r-- 1 labex labex 123 Jan XX HH:MM combined_output_shorthand.log -rw-r--r-- 1 labex labex 123 Jan XX HH:MM current_datetime.txt -rw-r--r-- 1 labex labex 123 Jan XX HH:MM errors.log -rw-r--r-- 1 labex labex 123 Jan XX HH:MM file_list.txt -rw-r--r-- 1 labex labex 123 Jan XX HH:MM fruits.txt -rw-r--r-- 1 labex labex 123 Jan XX HH:MM line_count.txt -rw-r--r-- 1 labex labex 0 Jan XX HH:MM ls_output.txt端末に
ls -lの出力が表示され、ls_output.txtというファイルが同じ内容で作成されます。ls_output.txtの内容を確認します。cat ls_output.txttotal 24 -rw-r--r-- 1 labex labex 123 Jan XX HH:MM combined_output.log ... (same as above) ...tee -aを使用して、出力をファイルに追加することもできます。echo "--- End of list ---" | tee -a ls_output.txt--- End of list ---行「--- End of list ---」が端末に出力され、
ls_output.txtに追加されます。更新された
ls_output.txtを確認します。cat ls_output.txttotal 24 ... (previous ls -l output) ... --- End of list ---
パイプラインは非常に汎用性が高く、多くの強力なシェルスクリプトとワンライナーコマンドのバックボーンを形成しています。単純なコマンドを組み合わせることで、複雑なデータ変換を効率的に実行できます。
Vim の基本操作によるテキストファイルの編集
このステップでは、Linux 環境で広く使用されている強力なテキストエディタである Vim の基本的な操作を学びます。Vim はさまざまなモードで動作し、初心者には少し難しいかもしれませんが、基本をマスターすることで生産性が大幅に向上します。
Vim はモードエディタであり、さまざまなタスクに対して異なるモードがあります。
- ノーマルモード(コマンドモード): これは Vim を開いたときのデフォルトモードです。このモードでは、キーストロークはコマンドとして解釈されます(例:カーソルの移動、テキストの削除、テキストのコピー)。
- インサートモード: このモードでは、入力した内容はすべてファイルに挿入されます。ノーマルモードからインサートモードに入るには、
i(カーソル位置に挿入)、a(カーソル後に追記)、o(下に新しい行を開く)などを押します。ノーマルモードに戻るには、Escを押します。 - ビジュアルモード: このモードでは、コピー、カット、削除などの操作のためにテキストのブロックを選択できます。ノーマルモードからビジュアルモードに入るには、
v(文字単位)、Shift+V(行単位)、またはCtrl+V(ブロック単位)を押します。ノーマルモードに戻るには、Escを押します。 - コマンドラインモード(Ex モード): このモードは、コロン(
:)で始まるコマンド(例:保存(:w)、終了(:q)、検索(/))を実行するために使用されます。ノーマルモードからこのモードに入るには、:を押します。
開く操作と基本的なナビゲーション
~/projectディレクトリにいることを確認します。cd ~/project[labex@host project]$vimを使用して、my_document.txtという新しいファイルを開きます。vim my_document.txtターミナルに Vim インターフェースが表示されます。現在、ノーマルモードです。
ノーマルモードでは、矢印キーまたは
h(左)、j(下)、k(上)、l(右)を使用してナビゲートできます。ファイルは空なので、まだあまりナビゲートできるものはありません。
インサートモード:テキストの追加
入力を開始するには、インサートモードに入る必要があります。
i(挿入)を押します。 ターミナルの左下に-- INSERT --と表示され、インサートモードになっていることがわかります。次の行を入力します。
This is the first line. This is the second line. This is the third line.インサートモードを終了してノーマルモードに戻るには、
Escキーを押します。-- INSERT --インジケーターが消えるはずです。
保存と終了
ノーマルモードでファイルを保存するには、
:wと入力してEnterを押します。:w下部に
my_document.txt[New]3L, 60B writtenと表示され、保存が確認されます。Vim を終了するには、
:qと入力してEnterを押します。:qシェルプロンプトに戻ります。
catを使用して、my_document.txtの内容を確認します。cat my_document.txtThis is the first line. This is the second line. This is the third line.
既存ファイルの編集
my_document.txtをもう一度開きます。vim my_document.txtノーマルモードで、カーソルを 2 行目の先頭に移動します(
jまたは矢印キーを使用)。Shift+Vを押して、ビジュアルラインモードに入ります。2 行全体がハイライト表示されます。yを押して、選択した行を「ヤンク」(コピー)します。カーソルを 3 行目の末尾に移動します(
jまたは矢印キーを使用)。pを押して、ヤンクした行を現在の行の下に「プット」(ペースト)します。 2 行目が 4 行目として再び表示されます。次に、行を削除しましょう。カーソルを 4 行目(先ほどペーストした行)に移動します。
dd(2 回d)を押して、行全体を削除します。最後の変更を元に戻すには、
uを押します。削除された行が再び表示されます。1 つのコマンドで保存して終了するには、
:wqと入力してEnterを押します。:wqもう一度
my_document.txtの内容を確認します。cat my_document.txtThis is the first line. This is the second line. This is the third line. This is the second line.ファイルには、2 行目が重複して 4 行あるはずです。
変更の破棄
変更を加えて、保存したくないと判断することがあります。
my_document.txtをもう一度開きます。vim my_document.txtiを押してインサートモードに入ります。最後に新しい行を追加します。
This line should not be saved.Escを押してノーマルモードに戻ります。:qを使用して終了を試みます。:qVim は警告します:
E37: No write since last change (add ! to override)。これは、未保存の変更があることを意味します。保存せずに終了するには、
:q!と入力してEnterを押します。:q!シェルプロンプトに戻り、変更は破棄されます。
my_document.txtの内容を確認します。cat my_document.txtThis is the first line. This is the second line. This is the third line. This is the second line.追加した最後の行は存在しないはずです。
これで、Vim の非常に基本的な操作(ファイルの開き方、テキストの挿入、ナビゲーション、保存、終了、変更の破棄)をカバーしました。これらは、Vim を始めるための基本的なスキルです。
シェル変数とエイリアスの設定と使用
このステップでは、シェル変数とエイリアスの設定と使用方法を学びます。これらは、シェル環境をカスタマイズし、データを保存し、頻繁に使用するコマンドのショートカットを作成できる強力な機能であり、コマンドラインの効率を大幅に向上させます。
シェル変数
シェル変数は、データを格納する名前付きエンティティです。数値、テキスト、またはシェルまたはシェル内で実行されるプログラムで使用できるその他のデータを格納できます。
~/projectディレクトリにいることを確認します。cd ~/project[labex@host project]$ローカル変数の設定:
MY_MESSAGEという単純な変数を作成しましょう。MY_MESSAGE="Hello, LabEx!"=記号の周りにスペースがないことに注意してください。変数へのアクセス: 変数の値にアクセスするには、その名前の前に
$記号を付けます。echo $MY_MESSAGEHello, LabEx!中括弧を使用した変数の展開: 特に他の文字が続く場合など、変数名を明確に区切る必要がある場合があります。これには、中括弧
{}を使用します。echo "The message is: ${MY_MESSAGE}."The message is: Hello, LabEx!.中括弧を省略すると、シェルは
MY_MESSAGE.を存在しない変数名として解釈する可能性があります。設定されているすべての変数のリスト表示:
setコマンドを使用して、現在設定されているすべてのシェル変数と関数をリスト表示できます。この出力は非常に長くなる可能性があるため、lessにパイプすることがよくあります。set | lessBASH=/usr/bin/bash BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath ... (press 'q' to quit less) ...qを押してlessを終了します。変数の未設定: 変数を削除するには、
unsetコマンドを使用します。unset MY_MESSAGE変数が設定されなくなったことを確認します。
echo $MY_MESSAGE空行が表示され、変数が未設定であることが示されます。
環境変数
環境変数は、子プロセスによって継承される特別なタイプのシェル変数です。これは、現在のシェルから起動されたすべてのプログラムまたはスクリプトがこれらの変数にアクセスできることを意味します。これらは通常、アプリケーションの環境を設定するために使用されます。
環境変数の設定:
exportコマンドを使用して、変数を環境変数にします。export EDITOR=vimこれにより、多くのプログラムが好みのテキストエディタを決定するために使用する
EDITOR環境変数が設定されます。環境変数のリスト表示:
envコマンドを使用して、環境変数のみをリスト表示します。env | grep EDITOREDITOR=vim変数のエクスポート解除:
export -nを使用して、変数を未設定にすることなくエクスポート解除できます。これにより、ローカル変数に戻ります。export -n EDITOR環境変数ではなくなったことを確認します。
env | grep EDITOR出力が表示されないはずです。ただし、ローカル変数としてはまだ存在します。
echo $EDITORvim完全に削除するには、
unsetを使用します。unset EDITOR
シェルエイリアス
エイリアスは、コマンドのショートカットです。これらを使用すると、より長いコマンドまたは一連のコマンドに展開される新しいコマンドを定義できます。これは、多くのオプションを持つ頻繁に使用するコマンドに非常に役立ちます。
エイリアスの作成:
ls -lのエイリアスを作成して、短くしましょう。alias ll='ls -l'単一引用符でコマンドを囲み、単一の文字列として扱われるようにします。
エイリアスの使用: これで、
ls -lの代わりにllと入力するだけです。lltotal 24 -rw-r--r-- 1 labex labex 123 Jan XX HH:MM combined_output.log ... (output of ls -l) ...エイリアスのリスト表示: 引数なしで
aliasコマンドを使用すると、定義されているすべてのエイリアスが表示されます。aliasalias ll='ls -l'シェルの設定によっては、他のデフォルトのエイリアスが表示される場合があります。
より複雑なエイリアスの作成: 引数を持つコマンドまたは複数のコマンドのエイリアスを作成することもできます。
alias myip='ip a | grep "inet " | grep -v "127.0.0.1" | awk "{print \$2}" | cut -d/ -f1'ここで、
myipはプライマリ IP アドレスを表示します。\$2に注意して、$記号をエスケープし、エイリアスが定義されたときにawkに渡され、シェルによって解釈されないようにします。myipエイリアスをテストします。myip172.17.0.2(IP アドレスは異なる場合があります)
エイリアスの未設定: エイリアスを削除するには、
unaliasコマンドを使用します。unalias llエイリアスが削除されたことを確認します。
aliasalias myip='ip a | grep "inet " | grep -v "127.0.0.1" | awk "{print \$2}" | cut -d/ -f1'llがリストに表示されなくなっているはずです。
シェル変数とエイリアスは一時的であり、ターミナルセッションを閉じると失われます。これらを永続的にするには、シェルの設定ファイル(例:~/.bashrc または ~/.profile)に追加する必要があります。これについては、より高度なトピックで説明します。
まとめ
この実験では、テキストファイルとシェル環境を管理するために不可欠な基本的な Linux コマンドラインスキルを学びました。まず、出力のリダイレクトを習得し、具体的には > を使用してファイルを上書きし、>> を使用してコンテンツを追加することで、ログ記録やさらなる処理のためにコマンドの結果をキャプチャできるようにしました。また、標準エラー (2>) のリダイレクトと、標準出力とエラーの組み合わせ (&>) を調べて、すべてのコマンド出力を効果的に管理する方法も学びました。
さらに、| 演算子を使用してコマンドパイプラインを構築し、理解する能力を習得し、コマンドを連鎖させてデータを順次処理できるようになりました。Vim を使用した基本的なテキスト編集について紹介され、ファイルの挿入、保存、終了のための基本的なコマンドを学びました。最後に、データを保存するためのシェル変数の設定と使用方法、および頻繁に使用するコマンドを簡素化するためのエイリアスの作成方法を学び、コマンドラインの効率とカスタマイズを向上させました。



