私は現在使用しています
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
私は現在使用しています
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
回答:
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)
現在のディレクトリに呼び出されたファイルがあった場合、再起動します。
では-x
、watch
シェルをスキップしてコマンドを直接実行するように指示しています。または、次のようにすることもできます。
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
ただし、ファイルごとに複数のコマンドを実行する必要があるため、効率が大幅に低下します。
これらの2つの例を組み合わせhead
てtail
好きに:
$ 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
パーツについて注意してください。*は、ディレクトリおよび読み取り権限のないファイルと一致するため、必要です。これにより、おそらく非表示にするエラーメッセージが生成されます。
find . -exec
D:またはSTHこのように