web-dev-qa-db-ja.com

いくつかの行に対してawkを実行する方法。

awkでいくつかの行を抽出したいと思います。次のタスクを実行することは可能ですか?

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

行番号122から129までの詳細を表示するにはどうすればよいですか?

22
cooldharma06

awkの仕組みを理解していません。指定された「プログラム」はalways入力の各行(またはawkの用語では「レコード」)ごとに1回実行され、FORまたは同様の構成は必要ありません。ただ使用する:

詳細な方法

ls -l | awk 'NR>=122 && NR<=129 { print }'

よりコンパクトな方法

ls -l | awk 'NR==122,NR==129'

これは、「番号レコード」であるNRの範囲を示します。通常、これはawkが処理している現在の行です。

40
zrajm

もう1つの代替方法は、sedを使用することです。

ls -l | sed -ne '122,129p'

しかし、あなたの質問が示唆しているように、これにawkを使用することが重要である場合は、Zrajmの回答に関するmanatworkのコメントに進んでください。 awkのドキュメントには、

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

したがって、必要に応じて、より高度な条件を作成することもできます。例えば:

ls -l | awk 'NR==122,/foobar/'

これは、122行目から出力を開始し、行に「foobar」という単語が含まれるまで続きます。

actualユースケースを教えていただければ、より良い解決策を提供する回答を提供できる可能性があります。これが XY問題 のように聞こえるのではないかと心配です。

9
ghoti

Coreutilsを使用してこれを行う別の方法(私はawkメソッドを好みます):

ls -l | tail -n +122 | head -n 8
3
terdon
 awk  'NR == 122,NR == 129{print $0}'  file

ここでは、ファイルの122から129までの行を抽出できます。

$0は、122〜129行のファイルデータ全体を印刷するために使用されます。

0
Ramya