Answers:
使用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运行将./*在每次迭代时扩展该glob 的shell 。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
但这会降低效率,因为这意味着每个文件运行多个命令。
find . -exec是这样的:D