web-dev-qa-db-ja.com

grepは何をしますか?

GNU.orggrepの説明は次のとおりです。

grepは、指定されたパターンリストへの一致を含む行の入力ファイルを検索します。行で一致するものが見つかると、その行を標準出力にコピーし(デフォルト)、オプションで要求した他の種類の出力を生成します。

私が頻繁に使用するこのコマンドは、現在接続されているモニターの名前を示しています。

xrandr | grep " connected " | awk '{ print$1 }'

このコマンドでファイルが表示されない、またはそれらへのリンクが表示されないので、正確に何が起こっているのですか? grepは、ファイルの検索以外のその他のものに使用されますか?

5
TellMeWhy

man grep (エンファシス鉱山)から:

grep  searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing  a  match to the given PATTERN.  By default, grep prints the
matching lines.

そして、 GNU docs (再び、私のもの):

2.4 grepプログラム

grepは、指定されたパターンに一致する行を含む名前付き入力ファイルを検索します。デフォルトでは、grepは一致する行を出力します。 -という名前のファイルは、標準入力を表します。 入力が指定されていない場合grepは、再帰を指定するコマンドラインオプションが指定されている場合、作業ディレクトリ.を検索します。それ以外の場合、grepは標準入力を検索します

この場合の標準入力は、xrandrの標準出力に接続されたパイプです。

この場合、grepは不要です。 awkは単独でジョブを実行できます。

xrandr | awk '/ connected /{print $1}'
14
muru

あなたがするとき:

xrandr | grep " connected "

基本的に、xrandrの標準出力(ファイル記述子1、/dev/stdout)をgrepの標準入力(ファイル記述子0、/dev/stdin)にリダイレクトします。これが仕事ですパイプの。

ファイル名が指定されていない場合、grepは標準入力から入力を取得するため、ファイルに関する限り、コマンドは成功します。

次のように考えることができます。

grep 'pattern' /dev/stdin

grepのみで目的の出力を取得できます(awkは不要)。

% xrandr | grep -Po '^[^ ]+(?= connected)'
LVDS1

これにより、最初のスペースで区切られた行のワード(^[^ ]+)に続いてスペースが取得され、その後connected(?= connected)<space>connectedを保証する幅0の正の先読みパターンになります。目的の部分の後に一致します)。

10
heemayl