awk
でいくつかの行を抽出したい。次のタスクを実行することは可能ですか:
ls -l | awk "BEGIN FOR(i=122;i<=129;i++) FNR==i"
行番号122から129までの詳細を表示するにはどうすればよいですか?
コメント
回答
awk
の仕組みを理解していません。指定された「プログラム」は、入力の各行(またはawk用語では「レコード」)に対して常に実行されます。FOR
または同様の構成。次を使用するだけです。
詳細な方法
ls -l | awk "NR>=122 && NR<=129 { print }"
よりコンパクトな方法
ls -l | awk "NR==122,NR==129"
これは、NR
の範囲を示します。これは、「番号レコード」であり、通常はこれです。 awk
が処理している現在の行です。
コメント
- 実際には典型的な
awk
このようなタスクのコードは通常ls -l | awk 'NR==122,NR==129'
です。 - awkを使用してファイルから最後の100行を取得するコマンドは何ですか
- @ShihabudheenKMこれをご覧ください: stackoverflow.com/questions/12546919/ …
回答
もう1つの代替方法は、sed
を使用することです。 :
ただし、質問が示唆しているように、これに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の問題。
回答
別の方法これを行うには(私はawk
メソッドを好みますが)coreutilsを使用します:
ls -l | tail -n +122 | head -n 8
回答
awk "NR == 122,NR == 129{print $0}" file
ここで、ファイルの122から129までの行を抽出できます。
$0
は、ファイルデータ全体を122〜129行で出力するために使用されます。
sed
sed
はawk
よりもはるかに小さい(そして読み込みが速い)ため、div>メソッド。