ウェブサイト検索

Linuxのgrepコマンドの使い方


ファイル内の情報を検索する基本を学び、grep と正規表現のクイック リファレンス ガイドのチートシートをダウンロードしてください。

1974 年に Ken Thompson によって開発された古典的な Unix コマンドの 1 つは、Global Regular Expression Print (grep) コマンドです。これはコンピューティング業界で広く普及しているため、動詞 (「ファイルを検索する」) として頻繁に使用されます。視聴者のマニアック度に応じて、現実世界のシナリオにもうまく適合します。 (たとえば、「その情報を思い出すには、メモリ バンクを grep する必要があります。」) つまり、grep は、ファイル内で特定の文字パターンを検索する方法です。それがワード プロセッサやテキスト エディタで利用できる最新の検索機能のように聞こえるのであれば、コンピューティング業界に対する grep の影響をすでに経験していることになります。

最新のテクノロジーに取って代わられた単なる古風なコマンドではなく、grep の真の威力は次の 2 つの側面にあります。

  • Grep はターミナル内で動作し、データのストリームを操作するため、複雑なプロセスに組み込むことができます。テキスト ファイル内の単語を検索できるだけではありません。単語を抽出したり、別のコマンドに送信したりすることができます。
  • Grep は正規表現を使用して、柔軟な検索機能を提供します。

grep コマンドの学習は簡単ですが、ある程度の練習が必要です。この記事では、私が最も便利だと思う機能のいくつかを紹介します。

[無料の grep チートシートをダウンロード]

grepのインストール

Linux を使用している場合は、grep がすでにインストールされています。

macOS には、BSD バージョンの grep があります。これは GNU バージョンとは若干異なるため、この記事に沿って正確に進めたい場合は、Homebrew や MacPorts などのプロジェクトから GNU grep をインストールしてください。

基本的な grep

基本的な grep 構文は常に同じです。 grep コマンドにパターンと検索対象のファイルを指定します。その代わりに、一致する各行が端末に出力されます。

$ grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

デフォルトでは、grep コマンドは大文字と小文字を区別するため、「gnu」は「GNU」や「Gnu」とは異なります。 --ignore-case オプションを使用すると、大文字の区別を無視するようにできます。

$ grep --ignore-case gnu gpl-3.0.txt
                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

--invert-match オプションを使用して、grep コマンドが一致なしのすべての行を返すようにすることもできます。

$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read

パイプ

ファイル内のテキストを検索できるのは便利ですが、POSIX の真の能力は、「パイプ」を介してコマンドを連鎖させる機能にあります。 grep を最もよく使うのは、cut、tr、curl などの他のツールと組み合わせるときです。

たとえば、ダウンロードしたい技術文書をリストしたファイルがあるとします。ファイルを開いて各リンクを手動でクリックし、Firefox のオプションをクリックして各ファイルをハード ドライブに保存することもできますが、これには多くの時間とクリック数が必要です。代わりに、--only-matching オプションを使用して、ファイル内のリンクを grep し、 一致する文字列のみを出力できます。

$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf

出力は、それぞれ 1 行の URL のリストです。これは Bash がデータを処理する方法に自然に適合しているため、URL を端末に出力する代わりに、それらを curl にパイプするだけです。

$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name

これにより、各ファイルがダウンロードされ、リモート ファイル名に従ってハード ドライブに保存されます。

この例の検索パターンは不可解に見えるかもしれません。これは、大量のテキストを幅広く検索する場合に特に便利な、一種の「ワイルドカード」言語である正規表現を使用しているためです。

正規表現

正規表現 (略して「regex」) が簡単だと誤解している人はいません。しかし、それは当然のことよりも悪い評判を持っていることが多いと思います。確かに、 正規表現を少し賢くなりすぎると、読みにくくなりすぎて自分自身に折り畳まれてしまう可能性がありますが、正規表現をやりすぎる必要はありません。ここでは、私が正規表現を使用する方法について簡単に紹介します。

まず、example.txt というファイルを作成し、そこに次のテキストを入力します。

Albania
Algeria
Canada
0
1
3
11

正規表現の最も基本的な要素は、謙虚な . 文字です。単一の文字を表します。

$ grep Can.da example.txt
Canada

. 文字が任意の1 つの文字を表すため、パターン Can.da は正常に Canada を返しました。

. ワイルドカードは、次の表記法で複数の文字を表すように変更できます。

  • ? は、前の項目と 0 回または 1 回一致します。
  • * は前の項目と 0 回以上一致します
  • + は前の項目と 1 回以上一致します
  • {4} は、前の項目と 4 回 (または中括弧内に入力した任意の数値) 一致します。

この知識を身につければ、午後中ずっと example.txt で正規表現を練習し、どのような興味深い組み合わせが思いつくかを確認できます。一部は機能しません。他の人もそうするだろう。重要なのは、結果を分析してその理由を理解することです。

高度な正規表現には、--extended-regexp または -E オプションが必要です。

たとえば、これはどの国も返すことができません。

$ grep -E A.a example.txt

. 文字は、レベルアップしない限り 1 つの文字にしか一致しないため、失敗します。 * 文字を使用すると、grep に 1 つの文字を 0 回、または単語の末尾に達するまで必要な回数だけ一致させるように指示できます。扱っているリストを知っているので、 この例ではゼロ回は役に立たないことがわかります。このリストには 3 文字の国名は絶対にありません。したがって、代わりに、+ を使用して単一の文字を少なくとも 1 回は一致させ、その後は単語の終わりまで必要なだけ何度でも一致させることができます。

$ grep -E A.+a example.txt
Albania
Algeria

角括弧を使用して文字のリストを指定できます。

$ grep -E [AC].+a example.txt
Albania
Algeria
Canada

これは数字にも当てはまります。次のような結果に驚かれるかもしれません。

$ grep [1-9] example.txt
1
3
11

1 ~ 9 の数字を検索すると 11 が表示されて驚きましたか?

リストに 13 を追加するとどうなりますか?

これらの数値は、一致する数字のリストに 1 が含まれているために返されます。

ご覧のとおり、正規表現はパズルのようなものですが、実験と練習を通じて慣れてきて、データの grep 方法を改善するために使用できるようになります。

チートシートをダウンロードする

grep コマンドには、この記事で説明したよりもはるかに多くのオプションがあります。結果のフォーマットを改善したり、一致を含むファイルと行番号をリストしたり、一致を囲む行を出力して結果のコンテキストを提供したりするためのオプションがあります。 grep を学習している場合、または grep を頻繁に使用して info ページを検索することに頼っている場合は、そのチートシートをダウンロードすると役に立ちます。このチートシートでは、一般的な grep の省略表現に慣れるための方法として短いオプション (たとえば、--invert-matching の代わりに -v) を使用しています。最も一般的な正規表現コードを覚えるのに役立つ正規表現セクションも含まれています。今すぐ grep チートシートをダウンロードしてください!

関連記事: