でいくつかの行を抽出したいawk
。次のタスクを実行することは可能ですか?
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
行番号122から129の詳細を表示するにはどうすればよいですか?
でいくつかの行を抽出したいawk
。次のタスクを実行することは可能ですか?
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
行番号122から129の詳細を表示するにはどうすればよいですか?
回答:
どのようにawk
機能するか理解できていません。指定された「プログラム」は、入力の各行(またはawkの用語では「記録」)に対して常に 1回実行さ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'
です。
もう1つの代替方法は、以下を使用することsed
です。
ls -l | sed -ne '122,129p'
しかし、あなたの質問が示唆しているように、これにawkを使用することが重要な場合は、マナトワークのZrajmの答えに対するコメントを参照してください。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問題のように聞こえるのではないかと心配しています。
sed
メソッドsed
よりもはるかに小さい(そしてロードが速い)ため、この方法をお勧めしますawk
。