を使用していくつかの行を抽出したいと思います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
awk
coreutilsを使用してこれを行う別の方法(私はこの方法を好むが):
ls -l | tail -n +122 | head -n 8