从bash中的多个数组中拉出相同的数据位置

时间:2014-09-05 18:42:14

标签: arrays bash

背景

我在这里尝试做的是从具有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

谢谢!

3 个答案:

答案 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