awk
でいくつかの行を抽出したいと思います。次のタスクを実行することは可能ですか?
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
行番号122から129までの詳細を表示するにはどうすればよいですか?
awk
の仕組みを理解していません。指定された「プログラム」はalways入力の各行(またはawkの用語では「レコード」)ごとに1回実行され、FOR
または同様の構成は必要ありません。ただ使用する:
詳細な方法
ls -l | awk 'NR>=122 && NR<=129 { print }'
よりコンパクトな方法
ls -l | awk 'NR==122,NR==129'
これは、「番号レコード」であるNR
の範囲を示します。通常、これはawk
が処理している現在の行です。
もう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問題 のように聞こえるのではないかと心配です。
Coreutilsを使用してこれを行う別の方法(私はawk
メソッドを好みます):
ls -l | tail -n +122 | head -n 8
awk 'NR == 122,NR == 129{print $0}' file
ここでは、ファイルの122から129までの行を抽出できます。
$0
は、122〜129行のファイルデータ全体を印刷するために使用されます。