Linuxでgrepコマンドを使用する方法
公開: 2022-01-29
Linux grepコマンドは、複数のファイルからの一致する行を表示する文字列およびパターンマッチングユーティリティです。 また、他のコマンドからのパイプ出力でも機能します。 その方法をお見せします。
grepの背後にあるストーリー
grepコマンドは、3つの理由でLinuxおよびUnixのサークルで有名です。 まず、それは非常に便利です。 第二に、豊富なオプションは圧倒される可能性があります。 第三に、それは特定のニーズを満たすために一晩で書かれました。 最初の2つは強打です。 3番目は少しずれています。
Ken Thompsonは、 edエディター(ee-deeと発音)から正規表現検索機能を抽出し、テキストファイルを検索するための小さなプログラムを作成しました。 ベル研究所の彼の部門長であるダグ・マキルロイは、トンプソンに近づき、彼の同僚の1人であるリー・マクマホンが直面している問題について説明しました。
マクマホンは、テキスト分析を通じて連邦主義の論文の著者を特定しようとしていました。 彼は、テキストファイル内のフレーズや文字列を検索できるツールを必要としていました。 Thompsonは、その夜に約1時間費やして、自分のツールを他の人が使用できる一般的なユーティリティにして、名前をgrepに変更しました。 彼はedコマンド文字列g/re/pから名前を取りました。これは、「グローバル正規表現検索」と解釈されます。
Thompsonがgrepの誕生についてBrianKernighanと話しているのを見ることができます。
grepを使用した単純な検索
ファイル内の文字列を検索するには、コマンドラインで検索語とファイル名を渡します。

一致する行が表示されます。 この場合、それは単一の行です。 一致するテキストが強調表示されます。 これは、ほとんどのディストリビューションでgrepのエイリアスが次のようになっているためです。
エイリアスgrep = 'grep --colour = auto'
一致する行が複数ある結果を見てみましょう。 アプリケーションログファイルで「平均」という単語を探します。 ログファイルで単語が小文字であるかどうかを思い出せないため、 -i (大文字と小文字を無視)オプションを使用します。
grep-i平均オタク-1.log

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

-v(一致の反転)オプションを使用して、一致しない行を表示できます。
grep -v Mem geek-1.log

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

grepを完全にサイレントにすることができます。 結果は、 grepからの戻り値としてシェルに渡されます。 結果が0の場合は文字列が見つかったことを意味し、結果が1の場合は文字列が見つからなかったことを意味します。 $?を使用してリターンコードを確認できます。 特別なパラメータ:
grep-q平均オタク-1.log
エコー$?
grep -q howtogeek geek-1.log
エコー$?

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

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

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

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

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

単語全体を検索する
デフォルトでは、検索ターゲットが別の文字列内を含むその行のどこかに表示される場合、 grepはその行と一致します。 この例を見てください。 「無料」という単語を検索します。
grep -i free geek-1.log

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

grepを強制的に個別の「単語」のみに一致させるには、 -w (word regexp)オプションを使用します。
grep -w -i free geek-1.log
エコー$?

今回は、検索語「free」が別の単語としてファイルに表示されないため、結果はありません。
複数の検索用語の使用
-E (拡張正規表現)オプションを使用すると、複数の単語を検索できます。 ( -Eオプションは、非推奨のegrepバージョンのgrepを置き換えます。)
このコマンドは、「average」と「memfree」の2つの検索語を検索します。
grep -E -w -i "average | memfree" geek-1.log

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

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

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

正確に一致する線
-x (line regexp)は、行全体が検索語に一致する行にのみ一致します。 ログファイルに1回だけ表示されることがわかっている日付とタイムスタンプを検索してみましょう。
grep -x "20-Jan--06 15:24:35" geek-1.log

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

次のようにコメント行を効果的に除外できます。
sudo grep -v "#" / etc / sudoers

これは解析がはるかに簡単です。
一致するテキストのみを表示する
一致する行全体ではなく、一致するテキストだけを表示したい場合があります。 -o (一致する場合のみ)オプションはまさにそれを行います。
grep -o MemFree geek-1.log

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

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


grepは、検索語がこのファイルに240回出現することを報告します。
-n (行番号)オプションを使用して、 grepに一致する各行の行番号を表示させることができます。
grep -n Jan geek-1.log

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

表示される結果の数を減らすには、 -m (最大カウント)オプションを使用します。 出力を5つの一致する行に制限します。
grep -m5 -n Jan geek-1.log

コンテキストの追加
一致する行ごとにいくつかの追加の行(おそらく一致しない行)を表示できると便利なことがよくあります。 一致した行のどれがあなたが興味を持っているものであるかを区別するのに役立ちます。
一致する行の後にいくつかの行を表示するには、-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 (一致するファイル)オプションを使用します。 sl.hヘッダーファイルへの参照が含まれているCソースコードファイルを見つけるには、次のコマンドを使用します。
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 (lines)オプションを使用すると、「ExtractParameters」を含むソースコードファイルの行数を数えることができます。 (これはgrep -c (count)オプションを使用して実現できますが、これはgrepからの配管を示すための優れた方法です。)
grep "ExtractParameters" * .c | wc -l

次のコマンドでは、 lsからの出力をgrepにパイプし、 grepからの出力をsortにパイプします。 現在のディレクトリにあるファイルを一覧表示し、「Aug」という文字列が含まれているファイルを選択して、ファイルサイズで並べ替えます。
ls -l | grep「8月」| + 4nを並べ替え

それを分解しましょう:
- ls -l :
lsを使用してファイルの長い形式のリストを実行します。 - grep“ Aug” :
lsリストから“ Aug”を含む行を選択します。 これにより、名前に「Aug」が含まれるファイルも検索されることに注意してください。 - sort + 4n :4番目の列(ファイルサイズ)でgrepからの出力をソートします。
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・patch・convert・rclone・shred・srm | |
| プロセス | エイリアス・screen・top・nice・renice・progress・strace・systemd・tmux・chsh・history・at・batch・free・which・dmesg・chfn・usermod・ps・chroot・xargs・tty・pinky・lsof・vmstat・タイムアウト・wall・yes・kill・sleep・sudo・su・time・groupadd・usermod・groups・lshw・shutdown・reboot・halt・poweroff・passwd・lscpu・crontab・date・bg・fg | |
| ネットワーキング | netstat・ping・traceroute・ip・ss・whois・fail2ban・bmon・dig・finger・nmap・ftp・curl・wget・who・whoami・w・iptables・ssh-keygen・ufw |
関連:開発者と愛好家のための最高のLinuxラップトップ

