LinuxでのFindおよびGrepコマンドの適切な使用

Unixシステム、特にLinuxの初心者ユーザーのほとんどは、このOSで使用されている基本的なコマンドライン演算子に慣れていません。 関数とfindおよびgrep演算子の使用方法を詳しく見てみましょう。

Linuxで検索とgrepコマンドを使用する。

見つける

Linuxのfindコマンドは、ファイル階層をたどるためのコマンドラインユーティリティです。 ファイルやディレクトリを検索し、それ以降の操作を実行するために使用できます。 ファイル、フォルダ、名前、作成日、変更日、所有者、および権限による検索をサポートしています。 -execを使用すると、見つかったファイルまたはフォルダに対して他のUNIXコマンドを実行できます。 構文:

$ find [検索を開始する場所] [式は検索対象を決定します] [-options] [検索対象]

オプション:

  • -exec - 上記の基準を満たし、コマンドが正常に実行された場合の終了状態として0を返す必須ファイル。
  • -ok - ユーザーが最初にプロンプ​​トを表示されることを除いて、-execと同じように機能します。
  • -inum N - 番号 "N"で検索します。
  • -links N - リンク "N"で検索します。
  • -name demo - 「demo」で指定されたファイルを検索します。
  • -newer file - “ file”の後に変更/作成されたファイルを検索します。
  • -perm octal - 解像度が8進数かどうかを検索します。
  • -print - 他の基準を使って見つかった文書へのパスを表示します。
  • -empty - 空の文書とディレクトリを検索します。
  • -size + N / -N - 検索ブロック "N"。 "N"と "c"は文字の大きさを測るのに使うことができます。 「+ N」はより大きいサイズの「N」ブロックを意味し、「 - N」はより小さいサイズの「N」ブロックを意味する。
  • -user name - ユーザー名または識別子 "name"に属する文書を検索します。
  • \(expr \) - "expr"が真ならば真。 ORまたはANDと組み合わせて基準をグループ化するために使用されます。

グレップ

grepコマンドはファイルを検索するために使用されます。 この関数は「グローバル表現の正規表現」を表し、Linuxで最も強力で頻繁に使用されるコマンドの1つです。 このコマンドは、指定されたパターンと一致する1つ以上の入力ファイルを検索し、対応する各行を標準出力に書き込みます。 ファイルが指定されていない場合、コマンドは標準入力から読み取ります。通常、これは別のコマンドの出力です。 この記事では、コマンドを入力する方法を、実用的な例と最も一般的なGNU grepオプションの詳細な説明と共に示します。

コマンド構文

コマンドを使い始める前に、基本的な構文を見直すことから始めましょう。 効用式は次の形式を取ります。

[オプション]パターン[ファイル...]

角括弧内の項目はオプションです。

  • オプション - ゼロ個以上の選択。 チームはその行動を制御するいくつかのオプションを提供します。
  • PATTERN - 検索パターン
  • FILE - 0個以上の入力ファイル名。

ファイルを検索するコマンドを入力する方法

このコマンドの主な目的は、ファイル内のテキストを検索することです。 たとえば、bash行を含む/ etc / passwdファイルから表示するには、次のコマンドを使用できます。

$ grep bash / etc / passwd

出力は次のようになります。

ルート0:0:ルート:/ルート:/ bin / bash

domain1000:1000:domain:/ home / domain:/ bin / bash

文字列にスペースが含まれる場合は、それを一重引用符または二重引用符で囲む必要があります。

$ "Gnomeディスプレイマネージャ" / etc / passwd

マッチを反転(ex)

パターンと一致しない行を表示するには、–v(または–invert-match)パラメータを入力します。 たとえば、/ etc / passwdファイルからnologinを含まないファイルを表示するには、次のコマンドを入力します。

$ -v nologin / etc / passwd

出力:

ルート0:0:ルート:/ルート:/ bin / bash

colord 124:124 :: / var / lib / colord:/ bin / false

git 994:994:gitデーモンユーザー:/:/ usr / bin / git-shell

linuxize 1000:1000:linuxize:/ home / linuxize:/ bin / bash

コマンドを使用して出力を検索する方法

代わりに、入力ファイルを指定した場合は、別のコマンドの出力をリダイレクトしてから、指定したパターンと一致する行だけを表示することができます。 たとえば、www-dataユーザーとしてシステム上でどのプロセスが実行されているかを調べるには、次のコマンドを使用できます。

$ ps -ef | www-data

出力:

www-data 18247 12675 4 16:00 00:00:00 php-fpm:プールwww

root 18272 17714 0 16:00 pts / 0 00:00:00 - カラー=自動 - 除外ディレクトリ= .bzr - 除外ディレクトリ= CVS - 除外ディレクトリ= .git - 除外ディレクトリ= .hg - 除外ディレクトリ= .svn www-data

www-data 31147 12770 0 10月22日? 00:05:51 nginx:ワーカープロセス

www-data 31148 12770 0 10月22日? 00:00:00 nginx:キャッシュマネージャプロセス

複数のチャンネルを1つのチームにまとめることもできます。 上記の出力からわかるように、プロセスを含む行もあります。 この行を表示したくない場合は、以下に示すように、出力を別のインスタンスに送信してください。

$ ps -ef | www-data | grep -v grep

出力:

www-data 18247 12675 4 16:00 00:00:00 php-fpm:プールwww

root 18272 17714 0 16:00 pts / 0 00:00:00 - カラー=自動 - 除外ディレクトリ= .bzr - 除外ディレクトリ= CVS - 除外ディレクトリ= .git - 除外ディレクトリ= .hg - 除外ディレクトリ= .svn www-data

www-data 31147 12770 0 10月22日? 00:05:51 nginx:ワーカープロセス

www-data 31148 12770 0 10月22日? 00:00:00 nginx:キャッシュマネージャプロセス

再帰検索

パターンを再帰的に検索するには、-r(または-recursive)オプションを入力します。 これにより、再帰的に発生するシンボリックリンクをスキップして、指定したディレクトリ内のすべてのファイルを検索できます。 すべてのシンボリックリンクをたどるには、-r(または-dereference-recursive)オプションを使用します。 次の例では、/ etcディレクトリ内のすべてのファイルでdomain.comを探しています。

$ -r domain.com / etc

このコマンドは、対応するフィールドにフルファイルパスプレフィックスを付けて表示します。

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com:server_name domain.com www.domain.com;

–rの代わりに–Rオプションを使用すると、コマンドはすべてのシンボリックリンクをたどります。

$ -R domain.com / etc

最後の出力フィールドに注目してください。 上記の例では印刷されていません。これは、sites-enabled Nginxディレクトリ内のファイルがsites-availableディレクトリ内の設定ファイルへのシンボリックリンクだからです。

出力:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com:server_name domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com:server_name domain.com www.domain.com;

ファイル名のみを表示

デフォルトの出力を抑制し、一致したパターンを含むファイルの名前のみを印刷するには、-l(または—files-with-matches)オプションを入力できます。 たとえば、現在の作業ディレクトリで.confで終わるすべてのファイルを検索し、domain.comタイプを含むファイル名だけを印刷するには、次のように入力します。

$ –L domain.com * .conf

出力は次のようになります。

tmux.conf

haproxy.conf

-lオプションは通常、再帰的な-Rオプションと組み合わせて使用​​されます。

$ - R1 domain.com / tmp

大文字と小文字の区別なし

デフォルトでは、このコマンドでは大文字と小文字が区別されます。つまり、大文字と小文字は区別されます。 検索時に大文字と小文字を区別しないようにするには、-i(または-ignore-case)オプションを入力します。 たとえば、オプションなしでZebraを検索した場合、次のコマンドは出力を表示しません。 マッチングがあります。

$ Zebra / usr / share / words

しかし、大文字と小文字を区別せずに検索を実行する場合は、–iオプションを使用すると、大文字と小文字の両方が一致します。

$ grep -i Zebra / usr / share / words

「Zebra」の表示は、「Zebra」、「ZEbrA」、またはその他の大文字と小文字の組み合わせに対応します。

出力:

シマウマ

シマウマ

シマウマ

完全一致

検索時に、gnuは、cygnusやmagnumなどの大きな単語が挿入されたgnuも印刷します。

$ gnu / usr / share / words

出力:

白鳥座

ヌー

中間期

lgnu9d

リグナム

マグナム

マグヌソン

ミズゴケ

ウィングナット

指定されたフィールドが単語全体(単語で囲まれていない)である式のみを返すには、-wオプション(または - word-regexp)を使用できます。

重要です。 単語の文字には、英数字(az、AZ、0-9)とアンダースコア(_)が含まれます。 他のすべての文字は非言語文字として扱われます。

–wオプションを含めて上記と同じコマンドを実行すると、コマンドはgnuを別の単語として含むもののみを返します。

$ grep -w gnu / usr / share / words

出力:gnu

番号を表示

パターンを含む行数を表示するには、-n(または-line-number)パラメーターを使用します。 このオプションを使用すると、一致が見つかった番号の接頭辞を付けて標準出力に一致を印刷します。 たとえば、bashプレフィックスとそれに対応する番号を含む/ etc / servicesファイルから表示するには、次のコマンドを使用できます。

$ grep -n 10000 / etc / services

以下の出力は、一致が10423と10424であることを示しています。

出力:

10423:ndmp 10, 000 / tcp

10424:ndmp 10000 / udp

カウント

一致する行数を標準出力に出力するには、–c(または–count)パラメーターを使用します。 以下の例では、シェル/ usr / bin / zshを持つアカウントの数を数えます。

$ grep -c '/ usr / bin / zsh' / etc / passwd

出力:4

複数行(パターン)

OR演算子は、2つ以上の検索パターンを組み合わせることができます。 デフォルトでは、このコマンドはパターンをメインの正規表現として解釈します。メタキャラクタはその特定の意味を失い、バックスラッシュを含むバージョンを使用する必要があります。 次の例では、Nginxエラーログファイルで、fatal、error、criticalという単語がすべて出現する箇所を検索しています。

$ grep 'fatal \ | error \ | critical' /var/log/nginx/error.log

拡張正規表現オプション-E(または-extended-regexp)を使用する場合は、以下に示すように文をエスケープしないでください。

$ grep -E '致命的|エラー|クリティカル' /var/log/nginx/error.log

正規表現

GNU Grepには、BasicとExtendedの2組の正規表現関数があります。 デフォルトでは、関数はパターンを基本的な正規表現として解釈します。拡張正規表現に切り替えるには、-Eオプションを使用する必要があります。 メインモードで正規表現を使用する場合、メタ文字を除く他のすべての文字は、実際には互いに対応する正規表現です。 以下は、最も一般的に使用されるメタ文字のリストです。

  • 行頭の式と一致させるには、^文字(キャレット文字)を使用します。 次の例では、^ kangarooは先頭にある場合にのみ一致します。$ grep "^ kangaroo" file.txt
  • 末尾の式に一致させるには、$(ドル)記号を使用します。 次の例では、kangaroo $は最後に見つかった場合にのみ一致します。grep "kangaroo $" file.txt
  • 記号を使用してください。 (ドット)任意の1文字に一致します。 たとえば、2文字のkanで始まりrooで終わるものすべてに一致させるには、次のパターンを使用できます。$ grep "kan..roo" file.txt
  • 角かっこで囲まれた任意の1文字と一致させるには、[](角かっこ)を使用します。 たとえば、acceptまたは "アクセントを含むものを見つけるには、次のパターンを使用できます。$ grep" acce [np] t "file.txt

次の文字の特別な意味を避けるために、\(バックスラッシュ)文字を使用してください。

拡張正規表現

パターンを拡張正規表現として解釈するには、-E(または-extended-regexp)パラメーターを使用します。 拡張正規表現には、基本的なすべてのメタ文字と、より複雑で強力な検索パターンを作成するための追加のメタ文字が含まれます。 以下はその例です。

  • このファイルからすべての電子メールアドレスを照合して抽出します。$ grep -E -o "\ b [A-Za-z0-9 ._%+ - ] [A-Za-z0-9 .-] + [A-Za-z] {2.6} \ b "file.txt
  • このファイルからすべての有効なIPアドレスをマッピングして抽出します。$ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]?[0-9] [0 (25 [0-5] | 2 [0-4] [0-9] | [01]?[0-9] [0-9]?)\(25 [0- 5] | 2 [0-4] [0-9] | [01]?[0-9] [0-9]?)\(25 [0-5] | 2 [0-4] [0- 9] | [01]?[0-9] [0-9]?) 'File.txt

-oオプションは一致のみを表示するために使用されます。

数える前に印刷する

マッチングの前に一定の行数を印刷するには、-B(または—before-context)パラメーターを使用します。 たとえば、マッチングの前に5行の初期コンテキストを表示するには、次のコマンドを使用できます。$ grep -A 5 root / etc / passwd

検索後に印刷

一致後に特定の行数を印刷するには、-A(または-after-context)パラメータを使用します。 たとえば、文字列の照合後に5行の最終コンテキストを表示するには、次のコマンドを使用します。$ grep -B 5 root / etc / passwd

これは、コマンド情報を最大限に活用するためにすべて必要です。 すでにLinuxを使用していて初心者に何かアドバイスがある場合は、この記事の下でコメントを共有してください。