awkを使用して、検索パラメータが見つかった後にのみ印刷を開始し、その背後にあるいくつかの列のみを印刷する方法を見つけようとします。
よりよく説明するために、多くの情報を1行に印刷するログファイルを見ています。私はそのパスのいくつかの側面を取って推定したいと思います。 IEには、次の行を含む大容量ファイルがあります。
とにかく、ここにJohn Doeという名前に関する多くの情報がありますが、それは止まりません。
名前を検索して印刷したいです。
名前: ジョン・ドウ
列セグメントを使用できることを知っていますが、実際には他のファイルの行名がどこにあるのかわかりません。
答え1
最も簡単な答えにはそのようなものは含まれませんawk
。 、 を使用して、grep
「name」という単語とその後に最大2つの単語が出る場合を出力します。
grep -o 'name [A-Za-z]* [A-Za-z]*' filename
スイッチには、-o
行全体ではなく一致する部分のみが含まれ、[A-Za-z]*
単語を要求していることを示します。
この作業が必要な場合はお知らせくださいawk
。しかし、これははるかに複雑です。
答え2
これは次の方法で行うこともできますawk
。
$ awk 'match( $0, /name [A-Z][a-z]* [A-Z][a-z]*/ ) { print substr( $0, RSTART, RLENGTH ) }' /path/to/inputfile
答え3
真珠解決策:
perl -lne '/(name:\s+\w+\s+\w+)/ and print $1'
\s
空白文字の一致(ビュー別のスペース、テーブルなど)\w
文字と数字の一致-lne
印刷を使用する場合を除き、何も印刷しない(n)を意味し、最後に改行文字(l)を出力して次のように実行します(e)。
したがって、行全体は名前と一致します。その後、1つ以上の空白文字と1つ以上の文字、1つ以上の空白文字と1つ以上の文字が続き、印刷されます。