複数行でawkを実行する方法は?

複数行でawkを実行する方法は?

を使用していくつかの行を抽出したいと思いますawk。次のことを行うことは可能ですか?

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

122~129行の詳細をどのように表示しますか?

答え1

あなたはそれがどのように機能するのか理解していませんawk。指定された「プログラム」はいつも入力の各行(またはawkという用語で「レコード」)に対して1回実行され、必要FORや類似の構成は必要ありません。ちょうど使用:

詳細な方法

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

よりコンパクトなアプローチ

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

これは通常、処理中の現在の行であるNR「番号付きレコード」の範囲を提供します。awk

答え2

別の選択肢は、次のものを使用することです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」という単語を含む行まで続きます。

あなたが私たちに話すなら実際ユースケースに応じて、より良いソリューションを提供するのに役立ちます。そんな音が聞こえるかと心配です。XYの問題

答え3

awkcoreutilsを使用してこれを行う別の方法(私はこの方法を好むが):

ls -l | tail -n +122 | head -n 8

関連情報