我正在尝试创建一个脚本来监视文件大小并 grep 作业 ID。问题是即使有多个进程正在运行,脚本也仅返回第一个 ID。知道为什么这不起作用吗?
#!/bin/sh
filename='bigfiles'
find /opt/Logs -type f -size +10k > $filename
count='cat bigfiles | wc -l'
while read -r line
do
pid= more "$line" | grep ID | awk -F '=' '{print $2}'>> pid.txt
done < $filename
另外,我需要扫描多个目录,如果日志文件的大小达到文件系统利用率的 25%,脚本应该扫描文件。关于如何合并这个有什么建议吗?
如果我使用 for 而不是 while,这会起作用
for line in $(cat bigfiles)
do echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(more $line | grep JOBID | awk -F '=' '{print $2}') >> hist.txt;
done
答案1
很难说为什么您的脚本表现不佳,因为我们不知道您正在处理的文件是什么样的。我们所知道的是,您对包含该字符串的行感兴趣ID
,并且希望获得=
这些行上 a 之后的任何内容。
您的脚本包含两个未使用的变量:(count
包含 shell 命令的字符串)和pid
(空变量)。你还需要经历很多困难才能到达后面的内容=
:
more "$line" | grep ID | awk -F '=' '{ print $2 }'
该more
命令是一个寻呼机,这意味着它是一个实用程序观看文件。您可以grep
直接读取文件,而不是使用它:
grep ID "$line" | awk -F '=' '{ print $2 }'
但这只是让它grep
做一些awk
自己能做的事情,
awk -F '=' '/ID/ { print $2 }' "$line"
但我们可以做得更好。$filename
我们可以让它find
为我们完成所有工作,而不是将所有路径名保存到文件中:
find /opt/Logs -type f -size +10k \
-exec awk -F '=' '/ID/ { print $2 }' {} + >pid.txt
这将找到所有/opt/Logs
大小大于 10 KB 或以下的常规文件。对于每个这样的文件,=
包含该字符串的每一行(第一行)之后的内容ID
将被打印。结果将保存到pid.txt
.
有关的:
答案2
filename='bigfiles' find /opt/Logs -type f -size +10k > $filename
for line in $(cat bigfiles)
do
echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(grep JOBID "$line" | awk -F '=' '{print $2}') >> hist.txt;
done