フォルダーのファイルの17行目(またはそれ以下の場合は最後)を監視するにはどうすればよいですか?


8

私は現在使用しています

watch head -n 17 *

動作しますが、17日までのすべての行も表示されます。基本的に、現在のアプローチで表示される各ファイルの最後の行のみを表示します。どうすればそれを達成できますか?

例として、行nrを減らします。7.に。

ファイルの例:

1
2
3
4
5
6
7
8

この行:

watch head -n 7 *

出力

1
2
3
4
5
6
7

私が欲しいところ:

7

回答:


15

GNUの場合awk

watch -x gawk '
  FNR == 17 {nextfile}
  ENDFILE   {if (FNR) printf "%15s[%02d] %s\n", FILENAME, FNR, $0}' ./*

次のような出力が得られます:

        ./file1[17] line17
  ./short-file2[05] line 5 is the last

./*グロブwatchが呼び出されるときに一度だけ展開されることに注意してください。

あなたはwatch head -n 17 *それの拡大などの任意のコマンドインジェクションの脆弱性だった*実際にシェルがシェルコードとして解釈されたwatch呼び出すは、スペースを引数の連結を解釈します。

$(reboot)現在のディレクトリに呼び出されたファイルがあった場合、再起動します。

では-xwatchシェルをスキップしてコマンドを直接実行するように指示しています。または、次のようにすることもできます。

watch 'exec gawk '\''
  FNR == 17 {nextfile}
  ENDFILE   {if (FNR) printf "%15s[%02d] %s\n", FILENAME, FNR, $0}'\'' ./*'

watchその拡大するシェル実行する./*各繰り返しでグロブを。watch foo bar実質的にはと同じwatch -x sh -c 'foo bar'です。を使用する場合watch -x、必要なシェルを指定できます。たとえば、zsh再帰的なグロビングを実行して通常のファイルに制限できるような、より強力なシェルを選択できます。

watch -x zsh -c 'awk '\''...'\'' ./**/*(.)'

がなくてもgawk、次のようなことができます。

watch '
  for file in ./*; do
    [ -s "$file" ] || continue
    printf "%s: " "$file"
    head -n 17 < "$file" | tail -n 1
  done'

次のような出力を与える:

./file1: line17
./short-file2: line 5 is the last

ただし、ファイルごとに複数のコマンドを実行する必要があるため、効率が大幅に低下します。


セキュリティに関するメモをありがとう。実際、あなたの言う通りで、私のコマンドも、私が必要とするものを実行しませんでした。つまり、追加されたファイルを監視して、バージョンも解決します。唯一の欠点私はこれはで行うことが考えていたのに、私はAWKを学ぶ必要があるということであるfind . -execD:またはSTHこのように
フェリックスDombek

11

これらの2つの例を組み合わせheadtail好きに:

$ seq 1 80 | head -n 17 | tail -n 1
17

$ seq 1 10 | head -n 17 | tail -n 1
10

したがって、実際の問題を解決するためのコマンドは次のとおりです。

watch 'for f in *; do head -n 17 -- "$f" 2>/dev/null | tail -n 1 ; done'

2>/dev/nullパーツについて注意してください。*は、ディレクトリおよび読み取り権限のないファイルと一致するため、必要です。これにより、おそらく非表示にするエラーメッセージが生成されます。


0

find、exec、sedによる別のアプローチ

watch find . -type f -name \"*\" -exec sh -c \'\( printf '%-50s ' {} \; sed -n 17p {}\)\' \\\;

1
17行未満のファイルでは機能しません。質問をよく読んでください。
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.