【Amazon】ブラックフライデー:11/29〜12/6

【初心者向け】Macでターミナルを活用する(後編)

11 min

こんにちは。ナミレリです。みなさん、Macのターミナルは使ってますか?

前編・中編に続き本記事はMacでターミナルを活用する(後編)です。

Macでターミナルを活用する(後編)では、grepコマンドのさわり紹介し、ターミナルで良く使うことになるリダイレクションやパイプの機能を使ってみます。これらの機能を試しながらターミナルの奥深さや楽しさを経験していただきたくご紹介します。

この記事はこんな人にオススメ

  • ターミナルでテキスト処理って何が便利なの?
  • リダイレクションやパイプって何?
  • Macでターミナルを活用したい

前編ではターミナルを使う前に知っておくべきことをまとめています。ぜひご覧ください。

また中編では7つのコマンドを試しながらターミナルの奥深さや楽しさを紹介しています。こちらも合わせてご覧ください。

Macでターミナルを活用し作業に対する日々のモチベーションを爆上げして楽しいMacライフになると幸いです。

この記事でわかること

  • grepコマンドの基本的な使い方と代表的なオプション
  • リダイレクション機能の使い方
  • パイプ機能の使い方
  • パイプを使ってWEBサーバのアクセスログを簡易的に集計してみる

この記事のMac環境
  • MacBook Pro 14インチ M1Max
  • macOS Monterey 12.2.1
  • ターミナル バージョン2.12(443)
Parallels Desktop 20 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 20 for Mac

Parallels Desktop 20 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

grep(パターンにマッチする行を表示する)

grepはマニュアル(man grep)に「file pattern searcher」とあります。

grep指定するファイルを検索しパターンにマッチする行を表示します。膨大な行数のログからパターンにマッチする行を瞬時に表示したり、逆に不要なパターンにマッチする行を表示しないなどを行えます。また、ディレクトリ内の複数ファイルを対象にパターンマッチする行を表示することもできます。ディレクトリの対象は再帰的に検索することも出来ます

grepの使い方(書式)

% grep [OPTIONS] PATTERN [FILE...]

grepを使ってみる

grepを使い指定するファイルからパターンにマッチする行を表示してみましょう。

Desktopに「grep_test」というディレクトリを作成し、その中に「test.txt」を入れました。「test.txt」には下記のようにApple製品を記載してみました。

% pwd(現在のディレクトリを表示)
/Users/test-mac/Desktop/grep_test
% ls(ファイルの一覧を表示)
test.txt
% cat test.txt(catはファイルの内容を出力するコマンド)
Apple
Mac
iPhone
iPad
Apple Watch
AirPods
AirTag
Apple TV
HomePod mini
Apple Gift Card

「Apple」というパターンにマッチする行を表示してみます。

% grep Apple test.txt
Apple
Apple Watch
Apple TV
Apple Gift Card

grepのよく使うオプション

「-n」オプション(行番号を表示)

「-n」オプションを用いて行番号と共に表示してみます。「-n」はline-numberを意味します。

% grep -n Apple test.txt
1:Apple
5:Apple Watch
8:Apple TV
10:Apple Gift Card

「-c」オプション(マッチした回数を表示)

「-c」オプションを用いてマッチした回数を表示してみます「-c」はcountを意味します。

% grep -c Apple test.txt
4

「-i」オプション(大文字と小文字を区別しない)

「-i」オプションを用いて大文字と小文字を区別せずにマッチさせます。「-i」はignore-caseを意味します。

% grep -i iphone test.txt
iPhone
% grep -in IPHONE test.txt(-nと-iをオプションに指定
3:iPhone

「-v」オプション(マッチした行を表示しない)

「-v」オプションはマッチした行を表示せずマッチしなかった行を表示します。「-v」はinvert-matchを意味します。

% grep -v Apple test.txt
Mac
iPhone
iPad
AirPods
AirTag
HomePod mini
% grep -vn A test.txt(-nと-vをオプションに指定)
2:Mac
3:iPhone
4:iPad
9:HomePod mini

grepのよく使うオプション:前後の行の表示制御

grepでマッチした行の前後を確認したい、というシーンがあります。「-A」「-B」「-C」の3つのオプションがありますので試してみましょう。

前後の行の表示制御の使い方

% grep -A NUM [FILE...](マッチした行の後に続く行を表示)
% grep -B NUM [FILE...](マッチした行の前の行を表示)
% grep -C NUM [FILE...](マッチした行の前後を表示)

NUMで指定した数字の分だけ前後の行を表示します。それでは「test.txt」に対して3つのオプションを試してみます。

% cat test.txt(catはファイルの内容を出力するコマンド)
Apple
Mac
iPhone
iPad
Apple Watch
AirPods
AirTag
Apple TV
HomePod mini
Apple Gift Card

「-A」オプション(マッチした行の後に続く行を表示)

「-A」オプションはマッチした行の後に続く行を表示します。「-A」はafter-contextを意味します。

% grep -A 1 Mac test.txt(マッチした行の後に続く行を表示)
Mac
iPhone
% grep -A 2 Mac test.txt(マッチした行の後に続く行を表示)
Mac
iPhone
iPad

「-B」オプション(マッチした行の前の行を表示)

「-B」オプションはマッチした行の前の行を表示します。「-B」はbefore-contextを意味します。

% grep -B 1 Mac test.txt(マッチした行の前の行を表示)
Apple
Mac

「-C」オプション(マッチした行の前後を表示)

「-C」オプションはマッチした行の前後の行を表示します。「-C」はcontextを意味します。

% grep -C 1 Mac test.txt(マッチした行の前後を表示)
Apple
Mac
iPhone

grepのよく使うオプション:ディレクトリ配下を再帰的に検索

grepでディレクトリ配下全てを再帰的に検索したい、というシーンは結構ありますね。再帰的に検索する「-r」のオプションがありますで試してみましょう。

2つのディレクトリを用意し上記で用いた「test.txt」を2つのディレクトリに入れています。

% ls
grep_test_01/ grep_test_02/
% cat grep_test_01/test.txt(catはファイルの内容を出力するコマンド)
Apple
Mac
iPhone
iPad
Apple Watch
AirPods
AirTag
Apple TV
HomePod mini
Apple Gift Card
% cat grep_test_02/test.txt(catはファイルの内容を出力するコマンド)
Mac
iPhone
iPad
Apple Watch
AirPods
AirTag
Apple TV
HomePod mini
Apple Gift Card

「-r」のオプションを用いて「iPhone」という文字列を再帰的に検索してみます。

% grep -r iPhone *
grep_test_01/test.txt:iPhone
grep_test_02/test.txt:iPhone
% grep -rn iPhone *
grep_test_01/test.txt:3:iPhone
grep_test_02/test.txt:3:iPhone

リダイレクション機能を使ってみる

これまでMacのターミナルで様々なコマンドを使ってきました。キーボードからコマンドを入力すると画面(ターミナル)に結果が出力されます。この結果を画面(ターミナル)ではなくファイルに出力したり、あるコマンドの入力に切り替えることができます。

ファイルに出力を切り替える(ファイルに保存する)ことをリダイレクションといい、コマンドの入力に切り替えることをパイプといいます。

出力リダイレクション

出力リダイレクションの書式

「コマンド」の出力結果を画面から「出力ファイル」に切り替えるには下記のようにします。

% コマンド > 出力ファイル

出力リダイレクションを試してみる

calというコマンドを例にリダクレクションしてみましょう。calはカレンダーを表示するコマンドです。

% cal(calはカレンダーを表示するコマンド。現在の月のカレンダーが表示される)
      3月 2022         
日 月 火 水 木 金 土  
       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 31 

calの出力結果を「cal.txt」にリダイレクションします。(画面の出力をファイル出力に切り替える)

% cal > cal.txt
% (出力先を切り替えたので画面には何も表示しない)

lsで「cal.txt」が存在することを確認しcatでファイルの中身を確認します。

% ls
cal.txt
% cat cal.txt
      3月 2022         
日 月 火 水 木 金 土  
       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 31

リダイレクションで既存のファイルを上書きしない

次にリダイレクションの上書きと追記を試してみます。シェルの設定によっては警告なしで上書きされてしまうので設定を確認しましょう。

コマンド > 出力ファイル」でリダイレクションする際、すでにそのファイルが存在する場合でも新規でファイルを作成してしまいます。(上書きしてしまう)

コマンド > 出力ファイル」ですでにそのファイルが存在する場合にはエラーとなるようにシェルの設定(zshの設定)を確認します。setoptコマンドで確認します。

setoptはオプション設定が「有効」になっている項目が表示されます。

% setopt(zshのオプション設定を確認するコマンド)
alwaystoend
autocd
autopushd
autoresume
・・・・(省略)
% setopt | grep noclobber(noclobberの設定状態を確認する)
noclobber

上記のように「noclobber」がsetoptの結果に表示されていれば「コマンド > 出力ファイル」でそのファイルが存在する場合に、上書きをしない設定が有効になっています。

出力リダイレクションを試してみる(続き)

calで年と月を指定してカレンダーを表示します。

% cal -d 2022_04(-dオプションで2022年4月のカレンダーを表示する)
      4月 2022         
日 月 火 水 木 金 土  
                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 

cal -d 2022_04の出力結果を「cal.txt」にリダイレクションします。(画面の出力をファイル出力に切り替える)

% cal -d 2022_04 > cal.txt
zsh: file exists: cal.txt(cal.txtが既に存在するのでエラーとなる)

「>>」はファイルが存在している場合に末尾に追加するリダイレクションです。試してみます。

% cal -d 2022_04 >> cal.txt
% (出力先を切り替えたので画面には何も表示しない)

lsで「cal.txt」が存在することを確認しcatでファイルの中身を確認します。2022年4月のカレンダー(出力の結果)が追加されています。

% ls
cal.txt
% cat cal.txt
      3月 2022         
日 月 火 水 木 金 土  
       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 31        
                      
      4月 2022         
日 月 火 水 木 金 土  
                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  

入力リダイレクション

入力リダイレクションの書式

「コマンド」の入力をキーボード入力から「入力ファイル」に切り替えるには下記のようにします。

% コマンド < 入力ファイル

catに先ほどの「cal.txt」を入力リダイレクションしてみましょう。

% cat < cal.txt
      3月 2022         
日 月 火 水 木 金 土  
       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 31    
(省略)

シェルが「cal.txt」を入力としてcatに渡しています。標準入力の入力元をキーボードからファイルに切り替えています。つまりシェルがcal.txtの内容を読んでcatに入力しています。

パイプ機能を使ってみる

パイプとは、コマンドの結果(標準出力された結果)別のコマンドへ渡す(別のコマンドの標準入力にする)ことをいいます。

パイプ機能の書式

コマンド①の結果(標準出力)をコマンド②へ渡す(標準入力)には以下のようにします。

% コマンド| コマンド②(「|コマンドは何個でも繋げて書けます
% コマンド| コマンド②  | コマンド③  | コマンド④ ...........

パイプ機能を試してみる(lolcat)

lsの結果をlolcatに渡してみます。(lsの標準出力をlolcatの標準入力にする)

lolcatはmanに「rainbow coloring effect for text console display」とあります。ターミナルをレインボーカラーに彩ってくれます。

% cd /var
% pwd
/var
% ls -l | lolcat
lsの結果をlolcatに渡す(lsの標準出力をlolcatの標準入力にする)
lsの結果をlolcatに渡す(lsの標準出力をlolcatの標準入力にする)

パイプ機能を試してみる(応用編)

WEBサーバのアクセスログを簡易的に集計することを試してみます。IPアドレスをアクセスの多い順に並べてみます。

テスト用のアクセスログを準備する

テスト用に以下のようなテキストファイルの簡易的なアクセスログを準備してみます。

% cat access_log_test
192.168.5.5 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.1.1 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.4.4 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.3.3 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.2.2 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.2.2 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.3.3 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.4.4 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.4.4 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.5.5 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.4.4 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.5.5 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.5.5 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.5.5 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"
192.168.3.3 - - [17/Mar/2022:01:00:00 +0900] "GET / HTTP/2.0"

IPアドレスのみ切り出す (1)

cutコマンドを用いて、「access_log_test」のそれぞれの行から指定した部分だけを切り出します。各行において半角スペースで区切った1番目のフィールドがIPアドレスですので、catで「access_log_test」を標準出力して、その結果をcutに渡して切り出してみます

cutコマンドはmanに「cut out selected portions of each line of a file」とあります。ファイルの行から必要な部分だけを切り出し、標準出力に表示するコマンドです

% cat access_log_test | cut -d ' ' -f1
192.168.5.5
192.168.1.1
192.168.4.4
192.168.3.3
192.168.2.2
192.168.2.2
192.168.3.3
192.168.4.4
192.168.4.4
192.168.5.5
192.168.4.4
192.168.5.5
192.168.5.5
192.168.5.5
192.168.3.3

上でのcutのオプション
-dオプション(–delimiter):区切り文字を指定する
-fオプション(–fields):必要な項目を項目数で指定する

cut -d ‘ ‘ -f1で「半角スペースで区切り1番目のフィールドを切り出す」という意味になります。

IPアドレス毎に並び替える (2)

「IPアドレスのみ切り出す (1)」の結果をIPアドレス順で並び替えます。catcutした結果を今度はsortコマンドに渡します

sortコマンドはmanに「sort or merge records (lines) of text and binary files」とあります。 テキストファイルの行の並び替えを行うコマンドです

% cat access_log_test | cut -d ' ' -f1 | sort
192.168.1.1
192.168.2.2
192.168.2.2
192.168.3.3
192.168.3.3
192.168.3.3
192.168.4.4
192.168.4.4
192.168.4.4
192.168.4.4
192.168.5.5
192.168.5.5
192.168.5.5
192.168.5.5
192.168.5.5

IPアドレス順に並び替えることができました。

IPアドレス毎に重複を削除しカウントする (3)

「IPアドレス毎に並び替える (2)」の結果で重複している行を取り除き、かつ出現回数をカウントします。catcutsortした結果を今度はuniqコマンドに渡します

uniqコマンドはmanに「report or filter out repeated lines in a file」とあります。 繰り返し行の出力や削除を行うコマンドです

% cat access_log_test | cut -d ' ' -f1 | sort | uniq -c
   1 192.168.1.1
   2 192.168.2.2
   3 192.168.3.3
   4 192.168.4.4
   5 192.168.5.5

カウントが多い順に並び替える (4)

「IPアドレス毎に重複を削除しカウントする (3)」の結果だと違和感があるので、カウントが多い順に並べ替えます。sortの部分で-rオプションを使用します。

% cat access_log_test | cut -d ' ' -f1 | sort -r | uniq -c
   5 192.168.5.5
   4 192.168.4.4
   3 192.168.3.3
   2 192.168.2.2
   1 192.168.1.1

カウントが多い順に並び替えることができました。

トップ3を表示する (5)

「カウントが多い順に並び替える (4)」の結果をトップ3だけ表示してみます。catcutsortuniqした結果を、最後にheadコマンドに渡します。

% cat access_log_test | cut -d ' ' -f1 | sort -r | uniq -c | head -3
   5 192.168.5.5
   4 192.168.4.4
   3 192.168.3.3

トップ3の表示となりました。

最後に

最後まで読んでいただきありがとうございます。今回はMacでターミナルを活用する(後編)を紹介しました。grepやリダイレクション、パイプを活用するとテキスト処理が格段にアップし、Macを使うの魅力もグッとアップします。

Macの思想や大元がUnix系統であることをあらためて実感します。ぜひ皆さんもターミナルを活用してみてください。この記事がみなさんのMacライフに少しでもお役に立てたら幸いです。

MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。

Amazonの電子書籍読み放題サービス「Kindle Unlimited」でプライム会員を対象に、最初の3か月間を無料体験できるキャンペーンを実施中。マンガ、小説、ビジネス書、雑誌など500万冊から、好きな本を何冊でも読めるキャンペーンです。

初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。

定番おすすめ記事

Macを使う景色が一変しMacの魅力をグッをアップさせるターミナルを活用する記事をまとめました。ぜひご覧ください。

関連記事