「新しいLinuxの教科書」(Chapter 12〜20)からの学び

Linux

技術書を読んでブログで定期的(できたら毎週💦)アウトプットすることを目標にしております🏃

今回は第4弾として、新しいLinuxの教科書のChapter 12〜20を読んで学んだことや、本をきっかけに自分で調べたことをまとめてみました💡

実務未経験者の学習内容アウトプットですので、おかしな点等あればご指摘いただけますと幸いです🙇‍♂️

学んだこと

テキスト処理でよく使われるコマンド

uniqコマンドの注意点

  1. 連続した重複行のみを処理する
    uniqは連続している重複行のみを処理する。ファイル全体で重複している行を見つけるには、先にsortコマンドで行をソートする必要がある。
  2. 大文字と小文字は区別される
    uniqは大文字と小文字を区別する。つまり、「Apple」と「apple」は異なる行として扱われる。
  3. オプションを使って動作を調整する
    -cオプションを使用すると、各行が何回現れたかをカウントして表示できる。-dオプションは重複している行のみを表示し、-uオプションは重複していない行のみを表示する。
実行結果の例

以下の内容を含むexample.txtファイルを考える。

apple
banana
Apple
banana
banana
cherry
基本コマンド uniq example.txt の実行結果(事前に sort していない場合)
apple
banana
Apple
banana
cherry

この場合、連続していない banana 行は削除されない。

sort と組み合わせた場合 sort example.txt | uniq の実行結果
Apple
apple
banana
cherry

ここでは、sort によって行がソートされた後、uniq が連続する重複行を削除する。

重複カウント sort example.txt | uniq -c の実行結果
1 Apple
1 apple
3 banana
1 cherry

各行がファイル内で何回現れたかが表示される。

trコマンドの注意点

標準入力からのみデータを読み取る

trコマンドはファイル名を直接取れない。代わりに、パイプ(|)やリダイレクション(<)を用いてデータを渡す必要がある。

  • 誤った使用法(直接ファイル名を指定する)
tr 'A-Z' 'a-z' example.txt
  • 正しい使用法(パイプまたはリダイレクションを使用する)
cat example.txt | tr 'A-Z' 'a-z'
文字置換は1文字単位

各文字はその位置に応じて置換される。例えば、下記コードの場合、ax に、by に、cz に置換される。

cat example.txt | tr abc xyz

sedコマンド

テキストファイルの中のテキストを処理するためのコマンドラインツール。
sedはテキストを読み込み、指定されたコマンドに基づいて加工・変換し、その結果を標準出力に表示する。

sedの特徴
  1. テキストのストリーム処理: sedは入力されたテキストを一行ずつ処理する。各行が独立して扱われるため、ファイル全体を一度に読み込まない。
  2. パターンとアクション: sedは「パターン」と「アクション」を組み合わせて使う。パターンはテキストの特定の部分を指定し、アクションはその部分に対して行う操作(置換、削除、挿入など)を指定する。
  3. 非破壊的操作: 基本的に、sedはファイル自体を変更しない。アクションの結果は標準出力に表示され、元のファイルはそのまま保持される。
基本構文
sed [オプション] 'コマンド' ファイル名
例 1: テキストの置換
sed 's/old/new/' file.txt

このコマンドはfile.txtの中で最初に現れる”old”を”new”に置換する。全ての”old”を置換するには、「s/old/new/g」のようにgフラグを使う。

例 2: 行の削除

特定の行を削除することもできる。例えば、以下のコマンドは3行目を削除する。

sed '3d' file.txt
例 3: 行の表示

特定の行のみを表示することも可能。以下のコマンドは2行目のみを表示する。

sed -n '2p' file.txt

-nオプションは、デフォルトの出力を抑制し、指定された行のみを表示する。

awkコマンド

テキストファイルやデータストリームを行ごとに読み込み、指定されたパターンにマッチする行に対して特定のアクションを実行する。sedと似ているが、awkはsedより高機能であり、より複雑なテキスト処理やデータ抽出等に適している。

基本的な構文
awk '条件 { アクション }' ファイル名
  • 条件: 処理する行を選択するためのパターンや条件。
  • アクション: 条件にマッチした行に対して実行するコマンドや処理。
具体例
file.txtのサンプル内容
Alice 120 300
Bob 100 200
Charlie 150 400
David 80 150
Eve 200 500
例 1: フィールドの表示

コマンド:

awk '{ print $1, $3 }' file.txt

このコマンドは各行の1番目と3番目のフィールド(名前と3番目の数値)を表示する。

出力結果:

Alice 300
Bob 200
Charlie 400
David 150
Eve 500
例 2: 条件付き処理

コマンド:

awk '$2 > 100 { print $1 }' file.txt

このコマンドは、2番目のフィールド(中央の数値)が100より大きい行の1番目のフィールド(名前)のみを表示する。

出力結果:

Alice
Charlie
Eve
例 3: 合計の計算

コマンド:

awk '{ sum += $2 } END { print sum }' file.txt

このコマンドは、2番目のフィールドの値(各行の中央の数値)を合計する。
ENDブロックは、awkがファイルのすべての行を処理し終えた後に実行される特別なセクション。通常、awkはファイルの各行を一行ずつ読み込み、それぞれに対して指定されたアクションを実行するが、ENDブロック内のアクションはファイルの末尾に達した後に一度だけ実行される。

出力結果:

650
例 4: ファイルの加工

コマンド:

awk '{ print NR, $0 }' file.txt

このコマンドは、各行に行番号を追加して表示する。

  • NR: 現在処理中の行の行番号。awkはファイルの各行を1行ずつ読み込む際、それぞれに行番号を自動的に割り当てる。
  • $0: 現在処理中の行の全ての内容を表す。

出力結果:

1 Alice 120 300
2 Bob 100 200
3 Charlie 150 400
4 David 80 150
5 Eve 200 500

シェルスクリプト

シェルスクリプトとは?

一連のコマンドや手順を自動化するためのスクリプト。通常、テキストファイルにシェルで実行するコマンドを記述し、それを一つの実行可能なファイルとして保存する。
これにより、手動でコマンドを一つずつ実行する代わりに、複数のコマンドを含むスクリプトを一度に実行して、作業を自動化することができる。

シェルスクリプトの例

この例では、ユーザーのホームディレクトリ内のファイル数をカウントし、結果を表示するスクリプトを作成する。

#!/bin/bash

# ユーザーのホームディレクトリへ移動
cd ~

# ファイルの数をカウント
count=$(ls | wc -l)

# 結果を表示
echo "あなたのホームディレクトリには ${count} 個のファイルがあります。"
  1. このスクリプトをテキストエディタで作成し、count_files.shという名前で保存する。
  2. ターミナルを開き、スクリプトが保存されているディレクトリに移動する。
  3. スクリプトに実行権限を与える: chmod +x count_files.sh
  4. スクリプトを実行する: ./count_files.sh

シェルスクリプト実行結果の例

スクリプトを実行すると、以下のような出力が得られる(ファイル数はユーザーのホームディレクトリに依存する)

あなたのホームディレクトリには 42 個のファイルがあります

シェルスクリプトを使用するメリット

1. 自動化

  • 反復作業の簡略化: シェルスクリプトを使うと、繰り返し行う必要のあるタスク(例えばファイルのバックアップ、システムの状態のチェックなど)を自動化できる。
  • エラーの減少: 手作業でコマンドを入力するときに発生しやすいミスを防ぐことができる。

2. 時間の節約

  • 高速実行: 一連のコマンドをスクリプトとして実行する方が、手動で一つずつ実行するよりも時間を節約できる。
  • 即座に再利用可能: 一度作成したスクリプトは保存しておき、必要なときにいつでも簡単に再利用できる。

3. 移植性

  • 異なるシステムでの使用: 同じシェルを使用している他のLinuxシステムで、ほとんどまたは全く変更せずにスクリプトを実行できる。

シバンとは?

「シバン(Shebang)」は、スクリプトファイルの最初の行に書かれる特別な指示子(ディレクティブ)。シバンはスクリプトを実行する際に、どのシェルやインタプリタを使ってそのスクリプトを実行すべきかをシステムに教える役割を持つ。

シバンの書き方

シバンは次のように書かれる:

#!/bin/shellのパス

ここで、#!はシバンの開始を表し、その後にシェルやインタプリタの絶対パスが続く。

例えば、Bashスクリプトの場合、シバンは通常以下のようになる:

#!/bin/bash

これは、このスクリプトを/bin/bash(Bashシェル)を使用して実行するようシステムに指示する。

シバンの目的と重要性
  • 正しいシェルの指定: Linuxシステムには多くの種類のシェルが存在し、それぞれに独自の特徴や構文がある。シバンにより、スクリプトが意図したシェルで実行されることが保証される。
  • 移植性の向上: シバンを使用することで、異なるシステム間でスクリプトを移植しやすくなる。スクリプトがどのシェルを必要とするかが明示されているため、適切な環境で実行される可能性が高まる。
  • 直接実行可能: シバンを含むスクリプトは、ファイルに実行権限を与えることで直接実行することができる(例:./script.sh)。これにより、スクリプトを実行する際に毎回シェルを指定する必要がなくなる。

シェルスクリプトの実行方法

シェルスクリプトを実行する方法はいくつかあるが、一般的には ./ を使って直接実行する方法と、source コマンド(またはその短縮形である .)を使って実行する方法の2種類がよく使われる。

./ を使って実行する方法
  • ./script.sh のようにスクリプトを実行すると、そのスクリプトは現在のシェルから分離された新しいサブシェル(プロセス)で実行される。
  • スクリプト内で設定または変更された変数や環境設定は、スクリプトの実行が終了すると失われます。つまり、スクリプトが終了した後の現在のシェルには影響を与えない。
  • この方法でスクリプトを実行するには、スクリプトファイルに実行権限が必要chmod +x script.sh で設定)。
source コマンド(または .)で実行する
  • source script.sh または . script.sh とすることで、スクリプトは現在のシェル内で実行される。新しいサブシェルは作成されない。
  • スクリプト内で設定または変更された変数や環境設定は、スクリプトの実行が終了しても現在のシェルに保持される。これはシェルの設定や環境変数を変更するスクリプトを実行する場合に便利である。
  • source コマンドを使ってスクリプトを実行する場合、スクリプトファイルに実行権限がなくても実行できる。

シェルスクリプトを書くために必要なシェルの文法の基礎知識

コメント

# で始まる行はコメントとして扱われ、実行されない。

例:

# これはコメントです
echo "Hello World" # この部分もコメントです

実行結果:

Hello World
変数

変数に値を代入し、それを使用できる。

例:

name="Alice"echo "Hello, $name"

実行結果:

Hello, Alice
変数の書き方の注意点

1. 変数名と値の間にスペースを入れない

  • 正しい: name="Alice"
  • 誤り: name = "Alice"

変数を定義する際、変数名と等号(=)の間にスペースを入れてはいけない。スペースを入れると、シェルはそれを別々のコマンドまたは引数として解釈してしまう。

2. 変数名には特殊文字を使用しない

  • 変数名にはアルファベット(大文字・小文字)、数字、アンダースコア(_)のみを使用する
  • 変数名にハイフン(-)やスペースなどの特殊記号を使用しないこと。

3. 変数の値が空白や特殊文字を含む場合はダブルクォートを使用

  • : greeting="Hello, world!"

変数の値に空白、特殊文字(*?$など)、またはシェルによって解釈される他の文字が含まれている場合は、値をダブルクォートで囲むこと。

4. 変数展開時のクォートの使用

  • 変数展開時にも、特に変数の値に空白や特殊文字が含まれる可能性がある場合は、変数をダブルクォートで囲むこと。
  • 例: echo "$name"
条件分岐(if文)

条件に基づいて異なるアクションを実行する。

例:

name="Alice"
if [ "$name" == "Alice" ]; then
  echo "Hello, Alice"
else
  echo "You are not Alice"
fi

実行結果:

Hello, Alice
ループ

繰り返し処理を行う。

for

例:

for i in 1 2 3; do
  echo "Number $i"
done

実行結果:

Number 1
Number 2
Number 3
while

例:

count=1
while [ $count -le 3 ]; do
  echo "Count $count"
  count=$((count + 1))
done

実行結果:

Count 1
Count 2
Count 3
関数

再利用可能なコードブロックを定義する。

例:

say_hello() {
  echo "Hello, $1"
}
say_hello "Alice"

実行結果:

Hello, Alice
&&|| 演算子

&& は「AND」演算子として機能し、左側のコマンドが成功(終了ステータスが0)した場合にのみ、右側のコマンドを実行する。
|| は「OR」演算子として機能し、左側のコマンドが失敗(終了ステータスが非0)した場合にのみ、右側のコマンドを実行する。

例:

mkdir /tmp/mydir && echo "Directory created"
rm /tmp/nonexistentfile || echo "Cannot remove file"

実行結果:

  • mkdir /tmp/mydir && echo "Directory created": このコマンドは、/tmp/mydir ディレクトリが正常に作成された場合にのみ “Directory created” を出力します。
  • rm /tmp/nonexistentfile || echo "Cannot remove file": このコマンドは、/tmp/nonexistentfile が存在しないため削除できない場合に “Cannot remove file” を出力します。
改行

バックスラッシュ(\)は、シェルスクリプトにおいて「次の改行を無視する」という意味を持つ。つまり、スクリプト上で改行されているコマンドも、実際の実行時には一つの行として扱われる。

例:

echo "This is a very long line, but we can split it " \
"over multiple lines for readability"

実行結果:

This is a very long line, but we can split it over multiple lines for readability

正規表現

テキスト検索を行うときに、条件にマッチする文字列集合を表現するための記法である。
正規表現は、文字列の検索、置換、データ抽出など様々な場面で役立つ。

基本的な正規表現の要素

  1. ドット(.)
    • 任意の1文字にマッチする。
      例: a.b は「a」に続く任意の1文字と「b」にマッチする(「acb」、「aab」など)。
  2. アスタリスク(*)
    • 直前の文字の0回以上の繰り返しにマッチする。
      例: a* は「a」のない文字列や「a」が1回以上続く文字列にマッチする(「」、「a」、「aaa」など)。
  3. プラス(+)
    • 直前の文字の1回以上の繰り返しにマッチする。
      例: a+ は「a」が1回以上続く文字列にマッチする(「a」、「aa」など)。
  4. クエスチョンマーク(?)
    • 直前の文字の0回または1回の繰り返しにマッチする。
      例: a? は「a」がないか、または1回だけある文字列にマッチする(「」、「a」)。
  5. 角括弧([])
    • 括弧内の任意の1文字にマッチする。
      例: [abc] は「a」、「b」、「c」のいずれか1文字にマッチする。
  6. ハイフン(-)
    • 角括弧内で使用され、文字の範囲を指定する。
      例: [a-z] は任意の英小文字1文字にマッチする。
  7. キャレット(^)
    • 行の開始にマッチする。また、角括弧内で使用されると、否定を意味する。
      例: ^a は行の始まりの「a」にマッチし、[^a] は「a」以外の任意の1文字にマッチする。
  8. ドルマーク($)
    • 行の終了にマッチする。
      例: a$ は行の終わりの「a」にマッチする。

正規表現の例

  • ^The:「The」で始まる行にマッチ。
  • end$:「end」で終わる行にマッチ。
  • ^The end$:「The end」という行全体にマッチ。
  • r[au]n:「run」または「ran」にマッチ。

アーカイブと圧縮

アーカイブとは?

複数のファイルやディレクトリを一つのファイルにまとめること。もしくは、まとめたファイルのこと。

圧縮とは?

ファイルのサイズを小さくすること。ストレージの節約や転送時間の短縮が可能になる。

アーカイブと圧縮の一般的なコマンド

tar コマンド

複数のファイルやディレクトリを一つのアーカイブファイルにまとめることや、そのアーカイブからファイルを取り出すことができる。

tar コマンドの基本構文

アーカイブ作成: tar -cvf [アーカイブ名].tar [ファイル/ディレクトリ]
アーカイブ展開: tar -xvf [アーカイブ名].tar

アーカイブ作成の例

tar -cvf archive.tar file1.txt file2.txt dir1

このコマンドは file1.txtfile2.txt というファイルと dir1 というディレクトリを archive.tar というアーカイブにまとめる。

アーカイブ展開の例

tar -xvf archive.tar

このコマンドは archive.tar 内に含まれている file1.txtfile2.txtdir1 を元の形に戻す。

tarコマンドのオプション

-c: 新しいアーカイブを作成する。
-x: アーカイブからファイルを展開する。
-v: 処理中のファイル名を表示する(verboseモード)。
-f: アーカイブファイル名を指定する。

gzip コマンドとbzip2 コマンド

ファイルの圧縮と解凍を行うためのコマンド。

gzip コマンドの基本構文

圧縮: gzip [ファイル名]
解凍: gunzip [ファイル名.gz] または gzip -d [ファイル名.gz]

bzip2 コマンドの基本構文

圧縮: bzip2 [ファイル名]
解凍: bunzip2 [ファイル名.bz2] または bzip2 -d [ファイル名.bz2]

gzip コマンドとbzip2 コマンドの重要ポイント
  • gzipbzip2単一ファイルのみを圧縮するために設計されています。複数のファイルやディレクトリを圧縮するには、先に tar コマンドでアーカイブを作成する必要がある。
  • gzip は一般的に速度が速いですが、bzip2 はより高い圧縮率を提供する。
  • 圧縮や解凍後、元のファイルはデフォルトで削除される。元のファイルを保持したい場合は、gzip-k オプションを使用する(bzip2 にはこのオプションはない)。

パッケージ管理

パッケージとは?

パッケージは、ソフトウェアやアプリケーションをインストールするためのファイル群のこと。これには、実行ファイル、設定ファイル、ドキュメントなどが含まれる。

パッケージ管理システムの主な機能

  1. インストール: 新しいソフトウェアをシステムに追加する。
  2. アップデート: 既存のソフトウェアを最新のバージョンに更新する。
  3. 削除: システムからソフトウェアを削除する。
  4. 依存関係の管理: ソフトウェアが正しく動作するために必要な他のパッケージも一緒に管理する。
主なパッケージ管理システム
  1. APT (Advanced Package Tool): DebianやUbuntuなど、Debianベースのディストリビューションで使用される。
    • インストール: sudo apt-get install [パッケージ名]
    • アップデート: sudo apt-get update (パッケージリストの更新)、sudo apt-get upgrade (インストールされたパッケージのアップグレード)
    • 削除: sudo apt-get remove [パッケージ名]
  2. YUM (Yellowdog Updater, Modified): Red Hat、CentOSなど、Red Hatベースのディストリビューションで使用される。
    • インストール: sudo yum install [パッケージ名]
    • アップデート: sudo yum update [パッケージ名] (特定のパッケージ)、sudo yum update (全パッケージ)
    • 削除: sudo yum remove [パッケージ名]

感想など

  • AWSデプロイの時によく分からないまま作成したシェルスクリプトや、Dockerfileを作成している時に理解不十分なまま使用していたパッケージ管理関連のコマンド(apt-getやyum等)について、書籍で詳しく解説されており、理解を深めることができて良かった。
  • Chapter19(Git関連部分)は、Gitを他の書籍等で学習済みの人は飛ばしてもいいんじゃないかと感じた。(自分はGitの理解不十分なので一応一通り目を通した。)

コメント

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