如何按列和行打印数组的内容

如何按列和行打印数组的内容

我对 Bash 还很陌生,但我正在努力学习。我的问题是:

我正在运行这个 ps 来获取信息并发送到 /tmp/freememory.txt

#!/bin/bash
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head >/tmp/freememory.txt

cat   "/tmp/freememory.txt"

输出是

PID      PPID CMD                         %MEM %CPU
  859     1 /usr/lib/snapd/snapd         1.3  0.0
  890     1 /usr/bin/python3 /usr/share  0.9  0.0
  845     1 /usr/bin/python3 /usr/bin/n  0.8  0.0
  851     1 /usr/sbin/NetworkManager --  0.8  0.0
  300     1 /lib/systemd/systemd-journa  0.7  0.0
 1501     1 /usr/lib/packagekit/package  0.6  0.0
  996     1 /usr/bin/whoopsie -f         0.6  0.0
 3530     1 /usr/sbin/cups-browsed       0.5  0.0
  855     1 /usr/sbin/ModemManager --fi  0.4  0.0

我正在学习数组,所以我的想法是创建一个数组来显示相同​​的输出:

ARRAY= (cat /tmp/freememory.txt)


echo ${ARRAY[@]}

但输出难以阅读

PID PPID CMD %MEM %CPU 859 1 /usr/lib/snapd/snapd 1.3 0.0 890 1 /usr/bin/python3 /usr/share 0.9 0.0 845 1 /usr/bin/python3 /usr/bin/n 0.8 0.0 851 1 /usr/sbin/NetworkManager -- 0.8 0.0 300 1 /lib/systemd/systemd-journa 0.7 0.0 1501 1 /usr/lib/packagekit/package 0.6 0.0 996 1 /usr/bin/whoopsie -f 0.6 0.0 3530 1 /usr/sbin/cups-browsed 0.5 0.0 855 1 /usr/sbin/ModemManager --fi 0.4 0.0

有没有办法使数组输出看起来像来自(cat“/tmp/freememory.txt”)的第一个输出?

谢谢

答案1

bash shell 只支持一维数组 - 如果你对数组感到满意线mapfile使用(aka readarray)内置函数非常简单:

$ mapfile -t array < freememory.txt

$ printf '%s\n' "${array[@]}"
PID      PPID CMD                         %MEM %CPU
  859     1 /usr/lib/snapd/snapd         1.3  0.0
  890     1 /usr/bin/python3 /usr/share  0.9  0.0
  845     1 /usr/bin/python3 /usr/bin/n  0.8  0.0
  851     1 /usr/sbin/NetworkManager --  0.8  0.0
  300     1 /lib/systemd/systemd-journa  0.7  0.0
 1501     1 /usr/lib/packagekit/package  0.6  0.0
  996     1 /usr/bin/whoopsie -f         0.6  0.0
 3530     1 /usr/sbin/cups-browsed       0.5  0.0
  855     1 /usr/sbin/ModemManager --fi  0.4  0.0

注意双引号"${array[@]}"可以防止单词拆分。如果愿意,你可以跳过文件并直接从 ps 管道读取数组,使用流程替代

mapfile -t array < <(ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head)

相关内容