GNU.org のgrep
の説明は次のとおりです。
grep
は、指定されたパターンリストへの一致を含む行の入力ファイルを検索します。行で一致するものが見つかると、その行を標準出力にコピーし(デフォルト)、オプションで要求した他の種類の出力を生成します。
私が頻繁に使用するこのコマンドは、現在接続されているモニターの名前を示しています。
xrandr | grep " connected " | awk '{ print$1 }'
このコマンドでファイルが表示されない、またはそれらへのリンクが表示されないので、正確に何が起こっているのですか? grep
は、ファイルの検索以外のその他のものに使用されますか?
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}'
あなたがするとき:
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の正の先読みパターンになります。目的の部分の後に一致します)。