Shell 脚本未正确报告

Shell 脚本未正确报告

我正在尝试创建一个脚本来监视文件大小并 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

相关内容