技術ノート Linux Linux で grep コマンドを使用する方法

Linux で grep コマンドを使用する方法

重要なポイント

  • Linux の grep コマンドは、文字列およびパターンのマッチングに便利なツールであり、さまざまなオプションを使用してテキスト ファイルを検索できます。
  • grep を使用すると、単純な検索、再帰的検索、単語全体の検索、複数の検索語の使用、一致のカウント、コンテキストの追加、さらに操作するために出力を他のコマンドにパイプすることもできます。

Linux の grep コマンドは、複数のファイルから一致する行を表示する文字列およびパターン マッチング ユーティリティです。他のコマンドからの パイプされた出力 でも機能します。その方法をご紹介します。

Linux の Grep コマンド

grep コマンドは、3 つの理由から Linux および Unix 界隈で有名です。まず、非常に便利です。第二に、 オプションの豊富さが圧倒的になる可能性があります 。第三に、特定のニーズを満たすために一晩で書かれたということです。最初の 2 つは素晴らしいです。 3番目はわずかにずれています。

Ken Thompson は ed エディター ( イーディーと発音します ) から 正規表現 検索機能を抽出し、テキスト ファイルを検索するための小さなプログラムを自分用に作成しました。 ベル研究所 の部門長 ダグ・マキロイは トンプソンに近づき、同僚の リー・マクマホン が直面している問題について説明した。

マクマホンは本文分析を通じて フェデラリスト論文 の著者を特定しようとしていた。彼は、テキスト ファイル内の語句や文字列を検索できるツールを必要としていました。 Thompson はその夜約 1 時間を費やして、自分のツールを他の人が使用できる汎用ユーティリティにし、名前を grep に変更しました。彼はこの名前を、「グローバル正規表現検索」を意味する ed 文字列 g/re/p からとりました。

Thompson が grep の誕生について Brian Kernighan 話しているのを見ることができます

Linux で grep コマンドを使用する方法

grep コマンドを使用した簡単な検索

ファイル内の文字列を検索するには、コマンド ラインで検索語とファイル名を渡します。

一致する行が表示されます。この場合、それは単一行です。一致するテキストが強調表示されます。これは、ほとんどのディストリビューションでは grep エイリアスが次のとおりであるためです。

エイリアス grep='grep --colour=auto'

一致する行が複数ある結果を見てみましょう。アプリケーション ログ ファイルで「Average」という単語を探します。ログ ファイル内で単語が小文字であるかどうかを思い出せないため、 -i (大文字と小文字を無視する) オプションを使用します。

 grep -i 平均的な geek-1.log

一致するすべての行が表示され、各行で一致するテキストが強調表示されます。

-v (反転一致) オプションを使用すると、一致しない行を表示できます。

 grep -v Mem geek-1.log

これらは一致しない行であるため、強調表示はありません。

grep 完全に沈黙させることができます。結果は grep からの戻り値としてシェルに渡されます。結果が 0 の場合は文字列が見つかったことを意味し、結果が 1 の場合は文字列が見つからなかったことを意味します。 $? を使用して戻りコードを確認できます。 特別なパラメータ :

 grep -q 平均 geek-1.log

エコー$?

 grep -q  geek-1.log

エコー$? 

Linux で grep コマンドを使用する方法

grep を使用した再帰的検索

ネストされたディレクトリおよびサブディレクトリを検索するには、-r (再帰) オプションを使用します。コマンドラインではファイル名を指定せず、パスを指定する必要があることに注意してください。ここでは現在のディレクトリ「.」を検索しています。およびサブディレクトリ:

 grep -r -i memfree 。

出力には、一致する各行のディレクトリとファイル名が含まれます。

-R (再帰逆参照) オプションを使用すると、 grep シンボリック リンクをたどることができます。このディレクトリには、 logs-folder というシンボリック リンクがあります。これは /home/dave/logs を指します。

 ls -l ログフォルダー

-R (再帰逆参照) オプションを使用して最後の検索を繰り返してみましょう。

 grep -R -i memfree 。

シンボリック リンクをたどって、それが指すディレクトリも grep で検索されます。

Linux で grep コマンドを使用する方法

grep コマンドを使用して単語全体を検索する

デフォルトでは、 grep 、検索ターゲットがその行のどこか (別の文字列内を含む) に出現する場合にその行と一致します。この例を見てください。 「無料」という単語を検索してみます。

 grep -i free geek-1.log

結果は、文字列「free」を含む行になりますが、それらは別々の単語ではありません。これらは文字列「MemFree」の一部です。

grep 個別の「単語」のみに一致するように強制するには、 -w (単語正規表現) オプションを使用します。

 grep -w -i free geek-1.log

エコー$?

今回は、検索語「無料」がファイル内に別の単語として表示されないため、結果はありません。

Linux で grep コマンドを使用する方法

複数の検索語の使用

-E (拡張正規表現) オプションを使用すると、複数の単語を検索できます。 ( -E オプションは、 grep の非推奨の egrep バージョン を置き換えます 。)

このコマンドは、「average」と「memfree」という 2 つの検索語を検索します。

 grep -E -w -i "平均|memfree" geek-1.log

検索語ごとに、一致する行がすべて表示されます。

必ずしも完全な単語である必要はなく、複数の単語を検索することもできますが、完全な単語である場合もあります。

-e (パターン) オプションを使用すると、コマンド ラインで複数の検索語を使用できます。正規表現の括弧機能を利用して検索パターンを作成しています。これは、括弧「[]」内に含まれる文字のいずれかと一致するように grep 指示します。これは、 grep 検索時に「kB」または「KB」のいずれかと一致することを意味します。

両方の文字列が一致し、実際、一部の行には両方の文字列が含まれています。

Linux で grep コマンドを使用する方法

線を正確に一致させる

-x (行正規表現) は、行全体が検索語に一致する行のみに一致します。ログ ファイル内に 1 回だけ出現することがわかっている日付とタイム スタンプを検索してみましょう。

 grep -x "20-Jan--06 15:24:35" geek-1.log

一致する 1 行が検索されて表示されます。

その逆は、一致しない行だけを表示することです。これは、構成ファイルを確認するときに役立ちます。コメントは素晴らしいものですが、コメントの中から実際の設定を見つけるのが難しい場合があります。 /etc/sudoers ファイルは次のとおりです。

次のようにコメント行を効果的に除外できます。

 sudo grep -v "#" /etc/sudoers

そのほうが解析が簡単です。

Linux で grep コマンドを使用する方法

一致するテキストのみを表示する

一致する行全体ではなく、一致するテキストだけを表示したい場合があります。 -o (一致のみ) オプションはまさにそれを行います。

 grep -o MemFree geek-1.log

表示は、一致する行全体ではなく、検索語に一致するテキストのみを表示するように縮小されます。

grep を使用したカウント

grep テキストだけでなく、数値情報も提供できます。さまざまな方法で grep カウントさせることができます。ファイル内に検索語が何回出現するかを知りたい場合は、 -c (カウント) オプションを使用できます。

 grep -c 平均 geek-1.log

grep 、このファイル内に検索語が 240 回出現することを報告します。

-n (行番号) オプションを使用すると、 grep 一致する各行の行番号を表示できます。

 grep -n Jan geek-1.log

一致する各行の行番号が行の先頭に表示されます。

表示される結果の数を減らすには、 -m (最大数) オプションを使用します。出力を一致する 5 行に制限します。

 grep -m5 -n Jan geek-1.log

grep を使用してコンテキストを追加する

一致する行ごとに追加の行 (おそらく一致しない行) を確認できると、多くの場合便利です。一致した行のどれが関心のある行であるかを区別するのに役立ちます。

一致する行の後のいくつかの行を表示するには、-A (コンテキストの後) オプションを使用します。この例では次の 3 行を求めています。

 grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

一致する行の前のいくつかの行を表示するには、 -B (前のコンテキスト) オプションを使用します。

 grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

また、一致する行の前後の行を含めるには、 -C (コンテキスト) オプションを使用します。

 grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

一致するファイルの表示

検索語を含むファイルの名前を確認するには、 -l (一致するファイル) オプションを使用します。どの C ソース コード ファイルに sl.h ヘッダー ファイルへの参照が含まれているかを確認するには、次のコマンドを使用します。

 grep -l "sl.h" *.c

一致する行ではなく、ファイル名がリストされます。

もちろん、検索語を含まないファイルを探すこともできます。 -L (一致しないファイル) オプションはまさにそれを行います。

 grep -L "sl.h" *.c

行頭と行末

行の先頭または末尾に一致するもののみを表示するように grep 強制できます。 「^」正規表現演算子は行の先頭と一致します。実際には、ログ ファイル内のすべての行にスペースが含まれますが、最初の文字にスペースが含まれる行を検索します。

 grep "^ " geek-1.log

最初の文字としてスペースが含まれる行 (行の先頭) が表示されます。

行末と一致させるには、「$」正規表現演算子を使用します。 「00」で終わる行を検索します。

 grep "00$" geek-1.log

ディスプレイには、最後の文字が「00」である行が表示されます。

grep でパイプを使用する

もちろん、入力を grep にパイプしたり、 grep からの出力を別のプログラムにパイプしたり、 grep パイプ チェーンの途中に配置したりすることもできます。

C ソース コード ファイル内に出現する文字列「ExtractParameters」をすべて確認したいとします。かなりの数があることがわかっているので、出力を less にパイプします。

 grep "ExtractParameters" *.c |少ない

出力は、 less で表示されます。

これにより、ファイル リストのページを移動したり、 less's 検索機能を使用したりできます。

grep からの出力を wc にパイプし、 -l (行) オプションを使用すると、「ExtractParameters」を含むソース コード ファイル内の 行数をカウントできます 。 (これは grep -c (count) オプションを使用して実現できますが、これは grep からのパイプ処理を示す優れた方法です。)

 grep "ExtractParameters" *.c |トイレ -l

次のコマンドでは、 ls からの出力を grep にパイプし、 grep からの出力を sort にパイプしています。現在のディレクトリ内のファイルをリストし、文字列「Aug」を含むファイルを選択し、 ファイル サイズで並べ替えています

 ls -l | grep "8月" |ソート+4n

それを詳しく見てみましょう:

  • ls -l : ls を使用して、ファイルの長い形式のリストを実行します。
  • grep “Aug” : ls リストから「Aug」を含む行を選択します。これにより、名前に「Aug」が含まれるファイルも検索されることに注意してください。
  • sort +4n : grep からの出力を 4 列目 (ファイルサイズ) でソートします。

8 月に変更されたすべてのファイル (年に関係なく) がファイル サイズの昇順でソートされたリストを取得します。

Linux の grep: コマンドというより味方

grep 自由に使える素晴らしいツールです。それは 1974 年に遡り、今でも力強く機能し続けています。なぜなら、それが何をするのかが私たちに必要であり、これ以上のものはないからです。

grep 正規表現 fu を組み合わせると、 実際に次のレベルに進みます。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · グループ · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

「 Linux で grep コマンドを使用する方法」に関するベスト動画選定!

Linuxコマンドをこっそり練習する方法㊙
【初心者卒業!】 Linuxの基本はこれ一本でOK! 【Linuxまとめ】