こんにちは。ナミレリです。みなさん、Macのターミナルは使ってますか?
前編・中編に続き本記事はMacでターミナルを活用する(後編)です。
Macでターミナルを活用する(後編)では、grepコマンドのさわり紹介し、ターミナルで良く使うことになるリダイレクションやパイプの機能を使ってみます。これらの機能を試しながらターミナルの奥深さや楽しさを経験していただきたくご紹介します。
この記事はこんな人にオススメ
- ターミナルでテキスト処理って何が便利なの?
- リダイレクションやパイプって何?
- Macでターミナルを活用したい
前編ではターミナルを使う前に知っておくべきことをまとめています。ぜひご覧ください。
また中編では7つのコマンドを試しながらターミナルの奥深さや楽しさを紹介しています。こちらも合わせてご覧ください。
Macでターミナルを活用し作業に対する日々のモチベーションを爆上げして楽しいMacライフになると幸いです。
この記事でわかること
- grepコマンドの基本的な使い方と代表的なオプション
- リダイレクション機能の使い方
- パイプ機能の使い方
- パイプを使ってWEBサーバのアクセスログを簡易的に集計してみる
- MacBook Pro 14インチ M1Max
- macOS Monterey 12.2.1
- ターミナル バージョン2.12(443)
目次
grep(パターンにマッチする行を表示する)
grepはマニュアル(man grep)に「file pattern searcher」とあります。
grepは指定するファイルを検索しパターンにマッチする行を表示します。膨大な行数のログからパターンにマッチする行を瞬時に表示したり、逆に不要なパターンにマッチする行を表示しないなどを行えます。また、ディレクトリ内の複数ファイルを対象にパターンマッチする行を表示することもできます。ディレクトリの対象は再帰的に検索することも出来ます。
grepの使い方(書式)
% grep [OPTIONS] PATTERN [FILE...]↩
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 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のよく使うオプション:ディレクトリ配下を再帰的に検索
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はカレンダーを表示するコマンド。現在の月のカレンダーが表示される)
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
リダイレクションで既存のファイルを上書きしない
setoptはオプション設定が「有効」になっている項目が表示されます。
% setopt↩(zshのオプション設定を確認するコマンド)
alwaystoend
autocd
autopushd
autoresume
・・・・(省略)
% setopt | grep noclobber↩(noclobberの設定状態を確認する)
noclobber
出力リダイレクションを試してみる(続き)
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↩
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↩
パイプ機能を試してみる(応用編)
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に渡して切り出してみます。
% 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):必要な項目を項目数で指定する
IPアドレス毎に並び替える (2)
「IPアドレスのみ切り出す (1)」の結果をIPアドレス順で並び替えます。catしcutした結果を今度はsortコマンドに渡します。
% 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)」の結果で重複している行を取り除き、かつ出現回数をカウントします。catしcutしsortした結果を今度はuniqコマンドに渡します。
% 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だけ表示してみます。catしcutしsortしuniqした結果を、最後に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万冊以上が読み放題。お好きな端末で利用可能です。