いくつかの行でawkを実行する方法は?


18

でいくつかの行を抽出したいawk。次のタスクを実行することは可能ですか?

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

行番号122から129の詳細を表示するにはどうすればよいですか?


ループでこれを行う場合、sedメソッドsedよりもはるかに小さい(そしてロードが速い)ため、この方法をお勧めしますawk
zrajm

回答:


36

どのようにawk機能するか理解できていません。指定された「プログラム」は、入力の各行(またはawkの用語では「記録」)に対して常に 1回実行さFORれます。同様の構成は必要ありません。ただ使用する:

詳細な方法

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

よりコンパクトな方法

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

の範囲を指定しますNR。これは、「番号レコード」です。通常、これは現在awk処理中の行です。


6
実際、そのawkようなタスクの典型的なコードは通常ls -l | awk 'NR==122,NR==129'です。
マナトワーク

awkを使用してファイルから最後の100行を取得するコマンドは何ですか
Shihabudheen KM

8

もう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問題のように聞こえるのではないかと心配しています


2

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

ls -l | tail -n +122 | head -n 8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.