背景
我在这里尝试做的是从具有PID信息的文件中读取并将列分成数组。我已经完成了这部分,虽然我认为这是一种比我目前更好的方法(将同一个文件捕获4次)。
pid=( $(cat /tmp/deadpidlist.log | awk -F " " '{print $1}') )
cpu=( $(cat /tmp/deadpidlist.log | awk -F " " '{print $2}') )
mem=( $(cat /tmp/deadpidlist.log | awk -F " " '{print $3}') )
ctime=( $(cat /tmp/deadpidlist.log | awk -F " " '{print $4}') )
我做什么?哦,上帝
之后,我需要循环遍历每个PID,如果pid符合我要查找的条件,请将相应的cpu使用情况,内存使用情况和cpu时间放在文件中,然后通过电子邮件发送该文件。
for i in "${pid[@]}"
do
...
if grep -Fxq "$pattern" /tmp/or_report.log; then
echo "$i" >> /tmp/deadpidwalking.log
我的其余代码在这里有一个要点:https://gist.github.com/sithtoast/e1654adab3cceb137ba2
谢谢!
答案 0 :(得分:1)
bash
中的简单循环应该足够了。注意很少见的使用下标数组作为read
的参数。
declare -a pid cpu mem ctime
i=-1
while ((i++)); read "pid[i]" "cpu[i]" "mem[i]" "ctime[i]" and_the_rest; do
:
done < /tmp/deadpidlist.log
更直接的循环是
declare -a pid cpu mem ctime
while read a b c d and_the_rest; do
pid+=("$a")
cpu+=("$b")
mem+=("$c")
ctime+=("$d")
done < /tmp/deadpidlist.log
答案 1 :(得分:0)
第一部分:
while read -r ipid icpu imem ictime icmd
do
pid+=($ipid)
cpu+=($icpu)
mem+=($imem)
ctime+=($ictime)
cmd+=($icmd)
done < /tmp/deadpidlist.log
对要点的一些小评论:
使用功能。您可以节省很多输入重定向函数输出的输入 - 例如:
some() {
echo some
cat /some/file
}
#later
some >> /some/outfile
另外,您可以保存许多echo
,并将其分组为一个heredoc
some2() {
cat - <<EOF
some output what want
can use $variables
$(date) #command substitutions too
EOF
}
如果您不想要变量扩展,请使用heredoc
作为<<'EOF'
此外,您可以使用
let countertwo++ #instead of countertwo=$((countertwo + 1))
答案 2 :(得分:0)
为cpu,mem和ctime使用关联数组。此外,通过read
内置函数一次性读取输入。
declare -a pid
declare -A cpu
declare -A mem
declare -A ctime
while read this_pid this_cpu this_mem this_ctime tail; do
pid[${#pid[*]}]=$this_pid
cpu[$this_pid]=$this_cpu
mem[$this_pid]=$this_mem
ctime[$this_pid]=$this_ctime
done < /tmp/deadpidlist.log
for i in "${pid[@]}" do;
# ...
echo $i cpu[$i] mem[$i] ctime[$i]
done